{"version":3,"file":"bundle.js","sources":["../../../node_modules/svelte/internal/index.mjs","../../../node_modules/ssr-window/ssr-window.esm.js","../../../node_modules/dom7/dom7.esm.js","../../../node_modules/swiper/shared/dom.js","../../../node_modules/swiper/shared/utils.js","../../../node_modules/swiper/shared/get-support.js","../../../node_modules/swiper/shared/get-device.js","../../../node_modules/swiper/shared/get-browser.js","../../../node_modules/swiper/core/events-emitter.js","../../../node_modules/swiper/core/transition/transitionEmit.js","../../../node_modules/swiper/core/events/onTouchStart.js","../../../node_modules/swiper/core/events/onTouchMove.js","../../../node_modules/swiper/core/events/onTouchEnd.js","../../../node_modules/swiper/core/events/onResize.js","../../../node_modules/swiper/core/events/onClick.js","../../../node_modules/swiper/core/events/onScroll.js","../../../node_modules/swiper/core/events/index.js","../../../node_modules/swiper/core/breakpoints/setBreakpoint.js","../../../node_modules/swiper/core/defaults.js","../../../node_modules/swiper/core/moduleExtendParams.js","../../../node_modules/swiper/core/core.js","../../../node_modules/swiper/core/update/index.js","../../../node_modules/swiper/core/update/updateSize.js","../../../node_modules/swiper/core/update/updateSlides.js","../../../node_modules/swiper/core/update/updateAutoHeight.js","../../../node_modules/swiper/core/update/updateSlidesOffset.js","../../../node_modules/swiper/core/update/updateSlidesProgress.js","../../../node_modules/swiper/core/update/updateProgress.js","../../../node_modules/swiper/core/update/updateSlidesClasses.js","../../../node_modules/swiper/core/update/updateActiveIndex.js","../../../node_modules/swiper/core/update/updateClickedSlide.js","../../../node_modules/swiper/core/translate/index.js","../../../node_modules/swiper/core/translate/getTranslate.js","../../../node_modules/swiper/core/translate/setTranslate.js","../../../node_modules/swiper/core/translate/minTranslate.js","../../../node_modules/swiper/core/translate/maxTranslate.js","../../../node_modules/swiper/core/translate/translateTo.js","../../../node_modules/swiper/core/transition/index.js","../../../node_modules/swiper/core/transition/setTransition.js","../../../node_modules/swiper/core/transition/transitionStart.js","../../../node_modules/swiper/core/transition/transitionEnd.js","../../../node_modules/swiper/core/slide/index.js","../../../node_modules/swiper/core/slide/slideTo.js","../../../node_modules/swiper/core/slide/slideToLoop.js","../../../node_modules/swiper/core/slide/slideNext.js","../../../node_modules/swiper/core/slide/slidePrev.js","../../../node_modules/swiper/core/slide/slideReset.js","../../../node_modules/swiper/core/slide/slideToClosest.js","../../../node_modules/swiper/core/slide/slideToClickedSlide.js","../../../node_modules/swiper/core/loop/index.js","../../../node_modules/swiper/core/loop/loopCreate.js","../../../node_modules/swiper/core/loop/loopFix.js","../../../node_modules/swiper/core/loop/loopDestroy.js","../../../node_modules/swiper/core/grab-cursor/index.js","../../../node_modules/swiper/core/grab-cursor/setGrabCursor.js","../../../node_modules/swiper/core/grab-cursor/unsetGrabCursor.js","../../../node_modules/swiper/core/breakpoints/index.js","../../../node_modules/swiper/core/breakpoints/getBreakpoint.js","../../../node_modules/swiper/core/check-overflow/index.js","../../../node_modules/swiper/core/classes/index.js","../../../node_modules/swiper/core/classes/addClasses.js","../../../node_modules/swiper/core/classes/removeClasses.js","../../../node_modules/swiper/core/images/index.js","../../../node_modules/swiper/core/images/loadImage.js","../../../node_modules/swiper/core/images/preloadImages.js","../../../node_modules/swiper/shared/create-element-if-not-defined.js","../../../node_modules/swiper/modules/navigation/navigation.js","../../../node_modules/swiper/shared/classes-to-selector.js","../../../node_modules/swiper/modules/pagination/pagination.js","../../../node_modules/swiper/modules/scrollbar/scrollbar.js","../../../node_modules/swiper/modules/a11y/a11y.js","../../../node_modules/swiper/modules/autoplay/autoplay.js","../../../node_modules/swiper/svelte/utils.js","../../../node_modules/swiper/core/modules/resize/resize.js","../../../node_modules/swiper/core/modules/observer/observer.js","../../../node_modules/swiper/svelte/params-list.js","../../../node_modules/swiper/svelte/update-swiper.js","../../../node_modules/swiper/svelte/swiper.svelte","../../../node_modules/swiper/svelte/get-params.js","../../../node_modules/swiper/svelte/init-swiper.js","../../../node_modules/swiper/svelte/get-changed-params.js","../../../node_modules/swiper/svelte/swiper-slide.svelte","../../../svelte-components/src/filter_utils.js","../../../svelte-components/src/GameCard.svelte","../../../svelte-components/src/Lineup.svelte","../../../svelte-components/src/PlayerCard.svelte","../../../node_modules/gaussian/lib/box-muller.js","../../../node_modules/gaussian/lib/gaussian.js","../../../node_modules/chart.js/dist/chunks/helpers.segment.js","../../../node_modules/chart.js/dist/chart.esm.js","../../../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js","../../../svelte-components/src/OverUnderChart.svelte","../../../svelte-components/src/PremiumOnly.svelte","../../../svelte-components/src/PropCalculator.svelte","../../../svelte-components/src/Gamelog.svelte","../../../svelte-components/src/SeasonAvgTable.svelte","../../../svelte-components/src/PlayerSummary.svelte","../../../svelte-components/src/PlayerModal.svelte","../../../svelte-components/src/Optimizer.svelte","../../../svelte-components/src/NbaSchedule.svelte","../../../svelte-components/src/PlayerDiv.svelte","../../../svelte-components/src/NoProj.svelte","../../../svelte-components/src/NflProj.svelte","../../../svelte-components/src/NbaProj.svelte","../../../svelte-components/src/DailySwiper.svelte","../../../svelte-components/src/BatterTable.svelte","../../../svelte-components/src/PitcherTable.svelte","../../../svelte-components/src/MlbProj.svelte","../../../svelte-components/src/NhlProj.svelte","../../../svelte-components/src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n    // @ts-ignore\n    for (const k in src)\n        tar[k] = src[k];\n    return tar;\n}\nfunction is_promise(value) {\n    return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n    element.__svelte_meta = {\n        loc: { file, line, column, char }\n    };\n}\nfunction run(fn) {\n    return fn();\n}\nfunction blank_object() {\n    return Object.create(null);\n}\nfunction run_all(fns) {\n    fns.forEach(run);\n}\nfunction is_function(thing) {\n    return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n    return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n    if (!src_url_equal_anchor) {\n        src_url_equal_anchor = document.createElement('a');\n    }\n    src_url_equal_anchor.href = url;\n    return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n    return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n    return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n    if (store != null && typeof store.subscribe !== 'function') {\n        throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n    }\n}\nfunction subscribe(store, ...callbacks) {\n    if (store == null) {\n        return noop;\n    }\n    const unsub = store.subscribe(...callbacks);\n    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n    let value;\n    subscribe(store, _ => value = _)();\n    return value;\n}\nfunction component_subscribe(component, store, callback) {\n    component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n    if (definition) {\n        const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n        return definition[0](slot_ctx);\n    }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n    return definition[1] && fn\n        ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n        : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n    if (definition[2] && fn) {\n        const lets = definition[2](fn(dirty));\n        if ($$scope.dirty === undefined) {\n            return lets;\n        }\n        if (typeof lets === 'object') {\n            const merged = [];\n            const len = Math.max($$scope.dirty.length, lets.length);\n            for (let i = 0; i < len; i += 1) {\n                merged[i] = $$scope.dirty[i] | lets[i];\n            }\n            return merged;\n        }\n        return $$scope.dirty | lets;\n    }\n    return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n    if (slot_changes) {\n        const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n        slot.p(slot_context, slot_changes);\n    }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n    const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n    update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n    if ($$scope.ctx.length > 32) {\n        const dirty = [];\n        const length = $$scope.ctx.length / 32;\n        for (let i = 0; i < length; i++) {\n            dirty[i] = -1;\n        }\n        return dirty;\n    }\n    return -1;\n}\nfunction exclude_internal_props(props) {\n    const result = {};\n    for (const k in props)\n        if (k[0] !== '$')\n            result[k] = props[k];\n    return result;\n}\nfunction compute_rest_props(props, keys) {\n    const rest = {};\n    keys = new Set(keys);\n    for (const k in props)\n        if (!keys.has(k) && k[0] !== '$')\n            rest[k] = props[k];\n    return rest;\n}\nfunction compute_slots(slots) {\n    const result = {};\n    for (const key in slots) {\n        result[key] = true;\n    }\n    return result;\n}\nfunction once(fn) {\n    let ran = false;\n    return function (...args) {\n        if (ran)\n            return;\n        ran = true;\n        fn.call(this, ...args);\n    };\n}\nfunction null_to_empty(value) {\n    return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n    store.set(value);\n    return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n    return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n    ? () => window.performance.now()\n    : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n    now = fn;\n}\nfunction set_raf(fn) {\n    raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n    tasks.forEach(task => {\n        if (!task.c(now)) {\n            tasks.delete(task);\n            task.f();\n        }\n    });\n    if (tasks.size !== 0)\n        raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n    tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n    let task;\n    if (tasks.size === 0)\n        raf(run_tasks);\n    return {\n        promise: new Promise(fulfill => {\n            tasks.add(task = { c: callback, f: fulfill });\n        }),\n        abort() {\n            tasks.delete(task);\n        }\n    };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n    is_hydrating = true;\n}\nfunction end_hydrating() {\n    is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n    // Return first index of value larger than input value in the range [low, high)\n    while (low < high) {\n        const mid = low + ((high - low) >> 1);\n        if (key(mid) <= value) {\n            low = mid + 1;\n        }\n        else {\n            high = mid;\n        }\n    }\n    return low;\n}\nfunction init_hydrate(target) {\n    if (target.hydrate_init)\n        return;\n    target.hydrate_init = true;\n    // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n    let children = target.childNodes;\n    // If target is <head>, there may be children without claim_order\n    if (target.nodeName === 'HEAD') {\n        const myChildren = [];\n        for (let i = 0; i < children.length; i++) {\n            const node = children[i];\n            if (node.claim_order !== undefined) {\n                myChildren.push(node);\n            }\n        }\n        children = myChildren;\n    }\n    /*\n    * Reorder claimed children optimally.\n    * We can reorder claimed children optimally by finding the longest subsequence of\n    * nodes that are already claimed in order and only moving the rest. The longest\n    * subsequence subsequence of nodes that are claimed in order can be found by\n    * computing the longest increasing subsequence of .claim_order values.\n    *\n    * This algorithm is optimal in generating the least amount of reorder operations\n    * possible.\n    *\n    * Proof:\n    * We know that, given a set of reordering operations, the nodes that do not move\n    * always form an increasing subsequence, since they do not move among each other\n    * meaning that they must be already ordered among each other. Thus, the maximal\n    * set of nodes that do not move form a longest increasing subsequence.\n    */\n    // Compute longest increasing subsequence\n    // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n    const m = new Int32Array(children.length + 1);\n    // Predecessor indices + 1\n    const p = new Int32Array(children.length);\n    m[0] = -1;\n    let longest = 0;\n    for (let i = 0; i < children.length; i++) {\n        const current = children[i].claim_order;\n        // Find the largest subsequence length such that it ends in a value less than our current value\n        // upper_bound returns first greater value, so we subtract one\n        // with fast path for when we are on the current longest subsequence\n        const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n        p[i] = m[seqLen] + 1;\n        const newLen = seqLen + 1;\n        // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n        m[newLen] = i;\n        longest = Math.max(newLen, longest);\n    }\n    // The longest increasing subsequence of nodes (initially reversed)\n    const lis = [];\n    // The rest of the nodes, nodes that will be moved\n    const toMove = [];\n    let last = children.length - 1;\n    for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n        lis.push(children[cur - 1]);\n        for (; last >= cur; last--) {\n            toMove.push(children[last]);\n        }\n        last--;\n    }\n    for (; last >= 0; last--) {\n        toMove.push(children[last]);\n    }\n    lis.reverse();\n    // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n    toMove.sort((a, b) => a.claim_order - b.claim_order);\n    // Finally, we move the nodes\n    for (let i = 0, j = 0; i < toMove.length; i++) {\n        while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n            j++;\n        }\n        const anchor = j < lis.length ? lis[j] : null;\n        target.insertBefore(toMove[i], anchor);\n    }\n}\nfunction append(target, node) {\n    target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n    const append_styles_to = get_root_for_style(target);\n    if (!append_styles_to.getElementById(style_sheet_id)) {\n        const style = element('style');\n        style.id = style_sheet_id;\n        style.textContent = styles;\n        append_stylesheet(append_styles_to, style);\n    }\n}\nfunction get_root_for_style(node) {\n    if (!node)\n        return document;\n    const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n    if (root && root.host) {\n        return root;\n    }\n    return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n    const style_element = element('style');\n    append_stylesheet(get_root_for_style(node), style_element);\n    return style_element;\n}\nfunction append_stylesheet(node, style) {\n    append(node.head || node, style);\n}\nfunction append_hydration(target, node) {\n    if (is_hydrating) {\n        init_hydrate(target);\n        if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentElement !== target))) {\n            target.actual_end_child = target.firstChild;\n        }\n        // Skip nodes of undefined ordering\n        while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n            target.actual_end_child = target.actual_end_child.nextSibling;\n        }\n        if (node !== target.actual_end_child) {\n            // We only insert if the ordering of this node should be modified or the parent node is not target\n            if (node.claim_order !== undefined || node.parentNode !== target) {\n                target.insertBefore(node, target.actual_end_child);\n            }\n        }\n        else {\n            target.actual_end_child = node.nextSibling;\n        }\n    }\n    else if (node.parentNode !== target || node.nextSibling !== null) {\n        target.appendChild(node);\n    }\n}\nfunction insert(target, node, anchor) {\n    target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n    if (is_hydrating && !anchor) {\n        append_hydration(target, node);\n    }\n    else if (node.parentNode !== target || node.nextSibling != anchor) {\n        target.insertBefore(node, anchor || null);\n    }\n}\nfunction detach(node) {\n    node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n    for (let i = 0; i < iterations.length; i += 1) {\n        if (iterations[i])\n            iterations[i].d(detaching);\n    }\n}\nfunction element(name) {\n    return document.createElement(name);\n}\nfunction element_is(name, is) {\n    return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n    const target = {};\n    for (const k in obj) {\n        if (has_prop(obj, k)\n            // @ts-ignore\n            && exclude.indexOf(k) === -1) {\n            // @ts-ignore\n            target[k] = obj[k];\n        }\n    }\n    return target;\n}\nfunction svg_element(name) {\n    return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n    return document.createTextNode(data);\n}\nfunction space() {\n    return text(' ');\n}\nfunction empty() {\n    return text('');\n}\nfunction listen(node, event, handler, options) {\n    node.addEventListener(event, handler, options);\n    return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n    return function (event) {\n        event.preventDefault();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_propagation(fn) {\n    return function (event) {\n        event.stopPropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction self(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.target === this)\n            fn.call(this, event);\n    };\n}\nfunction trusted(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.isTrusted)\n            fn.call(this, event);\n    };\n}\nfunction attr(node, attribute, value) {\n    if (value == null)\n        node.removeAttribute(attribute);\n    else if (node.getAttribute(attribute) !== value)\n        node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n    // @ts-ignore\n    const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n    for (const key in attributes) {\n        if (attributes[key] == null) {\n            node.removeAttribute(key);\n        }\n        else if (key === 'style') {\n            node.style.cssText = attributes[key];\n        }\n        else if (key === '__value') {\n            node.value = node[key] = attributes[key];\n        }\n        else if (descriptors[key] && descriptors[key].set) {\n            node[key] = attributes[key];\n        }\n        else {\n            attr(node, key, attributes[key]);\n        }\n    }\n}\nfunction set_svg_attributes(node, attributes) {\n    for (const key in attributes) {\n        attr(node, key, attributes[key]);\n    }\n}\nfunction set_custom_element_data(node, prop, value) {\n    if (prop in node) {\n        node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n    }\n    else {\n        attr(node, prop, value);\n    }\n}\nfunction xlink_attr(node, attribute, value) {\n    node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n    const value = new Set();\n    for (let i = 0; i < group.length; i += 1) {\n        if (group[i].checked)\n            value.add(group[i].__value);\n    }\n    if (!checked) {\n        value.delete(__value);\n    }\n    return Array.from(value);\n}\nfunction to_number(value) {\n    return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n    const array = [];\n    for (let i = 0; i < ranges.length; i += 1) {\n        array.push({ start: ranges.start(i), end: ranges.end(i) });\n    }\n    return array;\n}\nfunction children(element) {\n    return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n    if (nodes.claim_info === undefined) {\n        nodes.claim_info = { last_index: 0, total_claimed: 0 };\n    }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n    // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n    init_claim_info(nodes);\n    const resultNode = (() => {\n        // We first try to find an element after the previous one\n        for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                return node;\n            }\n        }\n        // Otherwise, we try to find one before\n        // We iterate in reverse so that we don't go too far back\n        for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                else if (replacement === undefined) {\n                    // Since we spliced before the last_index, we decrease it\n                    nodes.claim_info.last_index--;\n                }\n                return node;\n            }\n        }\n        // If we can't find any matching node, we create a new one\n        return createNode();\n    })();\n    resultNode.claim_order = nodes.claim_info.total_claimed;\n    nodes.claim_info.total_claimed += 1;\n    return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n    return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n        const remove = [];\n        for (let j = 0; j < node.attributes.length; j++) {\n            const attribute = node.attributes[j];\n            if (!attributes[attribute.name]) {\n                remove.push(attribute.name);\n            }\n        }\n        remove.forEach(v => node.removeAttribute(v));\n        return undefined;\n    }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n        const dataStr = '' + data;\n        if (node.data.startsWith(dataStr)) {\n            if (node.data.length !== dataStr.length) {\n                return node.splitText(dataStr.length);\n            }\n        }\n        else {\n            node.data = dataStr;\n        }\n    }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n    );\n}\nfunction claim_space(nodes) {\n    return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n    for (let i = start; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n            return i;\n        }\n    }\n    return nodes.length;\n}\nfunction claim_html_tag(nodes) {\n    // find html opening tag\n    const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n    const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n    if (start_index === end_index) {\n        return new HtmlTagHydration();\n    }\n    init_claim_info(nodes);\n    const html_tag_nodes = nodes.splice(start_index, end_index + 1);\n    detach(html_tag_nodes[0]);\n    detach(html_tag_nodes[html_tag_nodes.length - 1]);\n    const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n    for (const n of claimed_nodes) {\n        n.claim_order = nodes.claim_info.total_claimed;\n        nodes.claim_info.total_claimed += 1;\n    }\n    return new HtmlTagHydration(claimed_nodes);\n}\nfunction set_data(text, data) {\n    data = '' + data;\n    if (text.wholeText !== data)\n        text.data = data;\n}\nfunction set_input_value(input, value) {\n    input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n    try {\n        input.type = type;\n    }\n    catch (e) {\n        // do nothing\n    }\n}\nfunction set_style(node, key, value, important) {\n    node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        if (option.__value === value) {\n            option.selected = true;\n            return;\n        }\n    }\n    select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        option.selected = ~value.indexOf(option.__value);\n    }\n}\nfunction select_value(select) {\n    const selected_option = select.querySelector(':checked') || select.options[0];\n    return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n    return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n    if (crossorigin === undefined) {\n        crossorigin = false;\n        try {\n            if (typeof window !== 'undefined' && window.parent) {\n                void window.parent.document;\n            }\n        }\n        catch (error) {\n            crossorigin = true;\n        }\n    }\n    return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n    const computed_style = getComputedStyle(node);\n    if (computed_style.position === 'static') {\n        node.style.position = 'relative';\n    }\n    const iframe = element('iframe');\n    iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n        'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.tabIndex = -1;\n    const crossorigin = is_crossorigin();\n    let unsubscribe;\n    if (crossorigin) {\n        iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n        unsubscribe = listen(window, 'message', (event) => {\n            if (event.source === iframe.contentWindow)\n                fn();\n        });\n    }\n    else {\n        iframe.src = 'about:blank';\n        iframe.onload = () => {\n            unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n        };\n    }\n    append(node, iframe);\n    return () => {\n        if (crossorigin) {\n            unsubscribe();\n        }\n        else if (unsubscribe && iframe.contentWindow) {\n            unsubscribe();\n        }\n        detach(iframe);\n    };\n}\nfunction toggle_class(element, name, toggle) {\n    element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, bubbles = false) {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, bubbles, false, detail);\n    return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n    return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n    constructor() {\n        this.e = this.n = null;\n    }\n    c(html) {\n        this.h(html);\n    }\n    m(html, target, anchor = null) {\n        if (!this.e) {\n            this.e = element(target.nodeName);\n            this.t = target;\n            this.c(html);\n        }\n        this.i(anchor);\n    }\n    h(html) {\n        this.e.innerHTML = html;\n        this.n = Array.from(this.e.childNodes);\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert(this.t, this.n[i], anchor);\n        }\n    }\n    p(html) {\n        this.d();\n        this.h(html);\n        this.i(this.a);\n    }\n    d() {\n        this.n.forEach(detach);\n    }\n}\nclass HtmlTagHydration extends HtmlTag {\n    constructor(claimed_nodes) {\n        super();\n        this.e = this.n = null;\n        this.l = claimed_nodes;\n    }\n    c(html) {\n        if (this.l) {\n            this.n = this.l;\n        }\n        else {\n            super.c(html);\n        }\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert_hydration(this.t, this.n[i], anchor);\n        }\n    }\n}\nfunction attribute_to_object(attributes) {\n    const result = {};\n    for (const attribute of attributes) {\n        result[attribute.name] = attribute.value;\n    }\n    return result;\n}\nfunction get_custom_elements_slots(element) {\n    const result = {};\n    element.childNodes.forEach((node) => {\n        result[node.slot || 'default'] = true;\n    });\n    return result;\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n    let hash = 5381;\n    let i = str.length;\n    while (i--)\n        hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n    return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n    const step = 16.666 / duration;\n    let keyframes = '{\\n';\n    for (let p = 0; p <= 1; p += step) {\n        const t = a + (b - a) * ease(p);\n        keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n    }\n    const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n    const name = `__svelte_${hash(rule)}_${uid}`;\n    const doc = get_root_for_style(node);\n    active_docs.add(doc);\n    const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = append_empty_stylesheet(node).sheet);\n    const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n    if (!current_rules[name]) {\n        current_rules[name] = true;\n        stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n    }\n    const animation = node.style.animation || '';\n    node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n    active += 1;\n    return name;\n}\nfunction delete_rule(node, name) {\n    const previous = (node.style.animation || '').split(', ');\n    const next = previous.filter(name\n        ? anim => anim.indexOf(name) < 0 // remove specific animation\n        : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n    );\n    const deleted = previous.length - next.length;\n    if (deleted) {\n        node.style.animation = next.join(', ');\n        active -= deleted;\n        if (!active)\n            clear_rules();\n    }\n}\nfunction clear_rules() {\n    raf(() => {\n        if (active)\n            return;\n        active_docs.forEach(doc => {\n            const stylesheet = doc.__svelte_stylesheet;\n            let i = stylesheet.cssRules.length;\n            while (i--)\n                stylesheet.deleteRule(i);\n            doc.__svelte_rules = {};\n        });\n        active_docs.clear();\n    });\n}\n\nfunction create_animation(node, from, fn, params) {\n    if (!from)\n        return noop;\n    const to = node.getBoundingClientRect();\n    if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n        return noop;\n    const { delay = 0, duration = 300, easing = identity, \n    // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n    start: start_time = now() + delay, \n    // @ts-ignore todo:\n    end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n    let running = true;\n    let started = false;\n    let name;\n    function start() {\n        if (css) {\n            name = create_rule(node, 0, 1, duration, delay, easing, css);\n        }\n        if (!delay) {\n            started = true;\n        }\n    }\n    function stop() {\n        if (css)\n            delete_rule(node, name);\n        running = false;\n    }\n    loop(now => {\n        if (!started && now >= start_time) {\n            started = true;\n        }\n        if (started && now >= end) {\n            tick(1, 0);\n            stop();\n        }\n        if (!running) {\n            return false;\n        }\n        if (started) {\n            const p = now - start_time;\n            const t = 0 + 1 * easing(p / duration);\n            tick(t, 1 - t);\n        }\n        return true;\n    });\n    start();\n    tick(0, 1);\n    return stop;\n}\nfunction fix_position(node) {\n    const style = getComputedStyle(node);\n    if (style.position !== 'absolute' && style.position !== 'fixed') {\n        const { width, height } = style;\n        const a = node.getBoundingClientRect();\n        node.style.position = 'absolute';\n        node.style.width = width;\n        node.style.height = height;\n        add_transform(node, a);\n    }\n}\nfunction add_transform(node, a) {\n    const b = node.getBoundingClientRect();\n    if (a.left !== b.left || a.top !== b.top) {\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n    }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n    current_component = component;\n}\nfunction get_current_component() {\n    if (!current_component)\n        throw new Error('Function called outside component initialization');\n    return current_component;\n}\nfunction beforeUpdate(fn) {\n    get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n    get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n    get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n    get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n    const component = get_current_component();\n    return (type, detail) => {\n        const callbacks = component.$$.callbacks[type];\n        if (callbacks) {\n            // TODO are there situations where events could be dispatched\n            // in a server (non-DOM) environment?\n            const event = custom_event(type, detail);\n            callbacks.slice().forEach(fn => {\n                fn.call(component, event);\n            });\n        }\n    };\n}\nfunction setContext(key, context) {\n    get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n    return get_current_component().$$.context.get(key);\n}\nfunction getAllContexts() {\n    return get_current_component().$$.context;\n}\nfunction hasContext(key) {\n    return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n    const callbacks = component.$$.callbacks[event.type];\n    if (callbacks) {\n        // @ts-ignore\n        callbacks.slice().forEach(fn => fn.call(this, event));\n    }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n    if (!update_scheduled) {\n        update_scheduled = true;\n        resolved_promise.then(flush);\n    }\n}\nfunction tick() {\n    schedule_update();\n    return resolved_promise;\n}\nfunction add_render_callback(fn) {\n    render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n    flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n    if (flushing)\n        return;\n    flushing = true;\n    do {\n        // first, call beforeUpdate functions\n        // and update components\n        for (let i = 0; i < dirty_components.length; i += 1) {\n            const component = dirty_components[i];\n            set_current_component(component);\n            update(component.$$);\n        }\n        set_current_component(null);\n        dirty_components.length = 0;\n        while (binding_callbacks.length)\n            binding_callbacks.pop()();\n        // then, once components are updated, call\n        // afterUpdate functions. This may cause\n        // subsequent updates...\n        for (let i = 0; i < render_callbacks.length; i += 1) {\n            const callback = render_callbacks[i];\n            if (!seen_callbacks.has(callback)) {\n                // ...so guard against infinite loops\n                seen_callbacks.add(callback);\n                callback();\n            }\n        }\n        render_callbacks.length = 0;\n    } while (dirty_components.length);\n    while (flush_callbacks.length) {\n        flush_callbacks.pop()();\n    }\n    update_scheduled = false;\n    flushing = false;\n    seen_callbacks.clear();\n}\nfunction update($$) {\n    if ($$.fragment !== null) {\n        $$.update();\n        run_all($$.before_update);\n        const dirty = $$.dirty;\n        $$.dirty = [-1];\n        $$.fragment && $$.fragment.p($$.ctx, dirty);\n        $$.after_update.forEach(add_render_callback);\n    }\n}\n\nlet promise;\nfunction wait() {\n    if (!promise) {\n        promise = Promise.resolve();\n        promise.then(() => {\n            promise = null;\n        });\n    }\n    return promise;\n}\nfunction dispatch(node, direction, kind) {\n    node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n    outros = {\n        r: 0,\n        c: [],\n        p: outros // parent group\n    };\n}\nfunction check_outros() {\n    if (!outros.r) {\n        run_all(outros.c);\n    }\n    outros = outros.p;\n}\nfunction transition_in(block, local) {\n    if (block && block.i) {\n        outroing.delete(block);\n        block.i(local);\n    }\n}\nfunction transition_out(block, local, detach, callback) {\n    if (block && block.o) {\n        if (outroing.has(block))\n            return;\n        outroing.add(block);\n        outros.c.push(() => {\n            outroing.delete(block);\n            if (callback) {\n                if (detach)\n                    block.d(1);\n                callback();\n            }\n        });\n        block.o(local);\n    }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = false;\n    let animation_name;\n    let task;\n    let uid = 0;\n    function cleanup() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n        tick(0, 1);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        if (task)\n            task.abort();\n        running = true;\n        add_render_callback(() => dispatch(node, true, 'start'));\n        task = loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(1, 0);\n                    dispatch(node, true, 'end');\n                    cleanup();\n                    return running = false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(t, 1 - t);\n                }\n            }\n            return running;\n        });\n    }\n    let started = false;\n    return {\n        start() {\n            if (started)\n                return;\n            started = true;\n            delete_rule(node);\n            if (is_function(config)) {\n                config = config();\n                wait().then(go);\n            }\n            else {\n                go();\n            }\n        },\n        invalidate() {\n            started = false;\n        },\n        end() {\n            if (running) {\n                cleanup();\n                running = false;\n            }\n        }\n    };\n}\nfunction create_out_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = true;\n    let animation_name;\n    const group = outros;\n    group.r += 1;\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        add_render_callback(() => dispatch(node, false, 'start'));\n        loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(0, 1);\n                    dispatch(node, false, 'end');\n                    if (!--group.r) {\n                        // this will result in `end()` being called,\n                        // so we don't need to clean up here\n                        run_all(group.c);\n                    }\n                    return false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(1 - t, t);\n                }\n            }\n            return running;\n        });\n    }\n    if (is_function(config)) {\n        wait().then(() => {\n            // @ts-ignore\n            config = config();\n            go();\n        });\n    }\n    else {\n        go();\n    }\n    return {\n        end(reset) {\n            if (reset && config.tick) {\n                config.tick(1, 0);\n            }\n            if (running) {\n                if (animation_name)\n                    delete_rule(node, animation_name);\n                running = false;\n            }\n        }\n    };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n    let config = fn(node, params);\n    let t = intro ? 0 : 1;\n    let running_program = null;\n    let pending_program = null;\n    let animation_name = null;\n    function clear_animation() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function init(program, duration) {\n        const d = (program.b - t);\n        duration *= Math.abs(d);\n        return {\n            a: t,\n            b: program.b,\n            d,\n            duration,\n            start: program.start,\n            end: program.start + duration,\n            group: program.group\n        };\n    }\n    function go(b) {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        const program = {\n            start: now() + delay,\n            b\n        };\n        if (!b) {\n            // @ts-ignore todo: improve typings\n            program.group = outros;\n            outros.r += 1;\n        }\n        if (running_program || pending_program) {\n            pending_program = program;\n        }\n        else {\n            // if this is an intro, and there's a delay, we need to do\n            // an initial tick and/or apply CSS animation immediately\n            if (css) {\n                clear_animation();\n                animation_name = create_rule(node, t, b, duration, delay, easing, css);\n            }\n            if (b)\n                tick(0, 1);\n            running_program = init(program, duration);\n            add_render_callback(() => dispatch(node, b, 'start'));\n            loop(now => {\n                if (pending_program && now > pending_program.start) {\n                    running_program = init(pending_program, duration);\n                    pending_program = null;\n                    dispatch(node, running_program.b, 'start');\n                    if (css) {\n                        clear_animation();\n                        animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n                    }\n                }\n                if (running_program) {\n                    if (now >= running_program.end) {\n                        tick(t = running_program.b, 1 - t);\n                        dispatch(node, running_program.b, 'end');\n                        if (!pending_program) {\n                            // we're done\n                            if (running_program.b) {\n                                // intro — we can tidy up immediately\n                                clear_animation();\n                            }\n                            else {\n                                // outro — needs to be coordinated\n                                if (!--running_program.group.r)\n                                    run_all(running_program.group.c);\n                            }\n                        }\n                        running_program = null;\n                    }\n                    else if (now >= running_program.start) {\n                        const p = now - running_program.start;\n                        t = running_program.a + running_program.d * easing(p / running_program.duration);\n                        tick(t, 1 - t);\n                    }\n                }\n                return !!(running_program || pending_program);\n            });\n        }\n    }\n    return {\n        run(b) {\n            if (is_function(config)) {\n                wait().then(() => {\n                    // @ts-ignore\n                    config = config();\n                    go(b);\n                });\n            }\n            else {\n                go(b);\n            }\n        },\n        end() {\n            clear_animation();\n            running_program = pending_program = null;\n        }\n    };\n}\n\nfunction handle_promise(promise, info) {\n    const token = info.token = {};\n    function update(type, index, key, value) {\n        if (info.token !== token)\n            return;\n        info.resolved = value;\n        let child_ctx = info.ctx;\n        if (key !== undefined) {\n            child_ctx = child_ctx.slice();\n            child_ctx[key] = value;\n        }\n        const block = type && (info.current = type)(child_ctx);\n        let needs_flush = false;\n        if (info.block) {\n            if (info.blocks) {\n                info.blocks.forEach((block, i) => {\n                    if (i !== index && block) {\n                        group_outros();\n                        transition_out(block, 1, 1, () => {\n                            if (info.blocks[i] === block) {\n                                info.blocks[i] = null;\n                            }\n                        });\n                        check_outros();\n                    }\n                });\n            }\n            else {\n                info.block.d(1);\n            }\n            block.c();\n            transition_in(block, 1);\n            block.m(info.mount(), info.anchor);\n            needs_flush = true;\n        }\n        info.block = block;\n        if (info.blocks)\n            info.blocks[index] = block;\n        if (needs_flush) {\n            flush();\n        }\n    }\n    if (is_promise(promise)) {\n        const current_component = get_current_component();\n        promise.then(value => {\n            set_current_component(current_component);\n            update(info.then, 1, info.value, value);\n            set_current_component(null);\n        }, error => {\n            set_current_component(current_component);\n            update(info.catch, 2, info.error, error);\n            set_current_component(null);\n            if (!info.hasCatch) {\n                throw error;\n            }\n        });\n        // if we previously had a then/catch block, destroy it\n        if (info.current !== info.pending) {\n            update(info.pending, 0);\n            return true;\n        }\n    }\n    else {\n        if (info.current !== info.then) {\n            update(info.then, 1, info.value, promise);\n            return true;\n        }\n        info.resolved = promise;\n    }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n    const child_ctx = ctx.slice();\n    const { resolved } = info;\n    if (info.current === info.then) {\n        child_ctx[info.value] = resolved;\n    }\n    if (info.current === info.catch) {\n        child_ctx[info.error] = resolved;\n    }\n    info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n    ? window\n    : typeof globalThis !== 'undefined'\n        ? globalThis\n        : global);\n\nfunction destroy_block(block, lookup) {\n    block.d(1);\n    lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n    transition_out(block, 1, 1, () => {\n        lookup.delete(block.key);\n    });\n}\nfunction fix_and_destroy_block(block, lookup) {\n    block.f();\n    destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n    block.f();\n    outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n    let o = old_blocks.length;\n    let n = list.length;\n    let i = o;\n    const old_indexes = {};\n    while (i--)\n        old_indexes[old_blocks[i].key] = i;\n    const new_blocks = [];\n    const new_lookup = new Map();\n    const deltas = new Map();\n    i = n;\n    while (i--) {\n        const child_ctx = get_context(ctx, list, i);\n        const key = get_key(child_ctx);\n        let block = lookup.get(key);\n        if (!block) {\n            block = create_each_block(key, child_ctx);\n            block.c();\n        }\n        else if (dynamic) {\n            block.p(child_ctx, dirty);\n        }\n        new_lookup.set(key, new_blocks[i] = block);\n        if (key in old_indexes)\n            deltas.set(key, Math.abs(i - old_indexes[key]));\n    }\n    const will_move = new Set();\n    const did_move = new Set();\n    function insert(block) {\n        transition_in(block, 1);\n        block.m(node, next);\n        lookup.set(block.key, block);\n        next = block.first;\n        n--;\n    }\n    while (o && n) {\n        const new_block = new_blocks[n - 1];\n        const old_block = old_blocks[o - 1];\n        const new_key = new_block.key;\n        const old_key = old_block.key;\n        if (new_block === old_block) {\n            // do nothing\n            next = new_block.first;\n            o--;\n            n--;\n        }\n        else if (!new_lookup.has(old_key)) {\n            // remove old block\n            destroy(old_block, lookup);\n            o--;\n        }\n        else if (!lookup.has(new_key) || will_move.has(new_key)) {\n            insert(new_block);\n        }\n        else if (did_move.has(old_key)) {\n            o--;\n        }\n        else if (deltas.get(new_key) > deltas.get(old_key)) {\n            did_move.add(new_key);\n            insert(new_block);\n        }\n        else {\n            will_move.add(old_key);\n            o--;\n        }\n    }\n    while (o--) {\n        const old_block = old_blocks[o];\n        if (!new_lookup.has(old_block.key))\n            destroy(old_block, lookup);\n    }\n    while (n)\n        insert(new_blocks[n - 1]);\n    return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n    const keys = new Set();\n    for (let i = 0; i < list.length; i++) {\n        const key = get_key(get_context(ctx, list, i));\n        if (keys.has(key)) {\n            throw new Error('Cannot have duplicate keys in a keyed each');\n        }\n        keys.add(key);\n    }\n}\n\nfunction get_spread_update(levels, updates) {\n    const update = {};\n    const to_null_out = {};\n    const accounted_for = { $$scope: 1 };\n    let i = levels.length;\n    while (i--) {\n        const o = levels[i];\n        const n = updates[i];\n        if (n) {\n            for (const key in o) {\n                if (!(key in n))\n                    to_null_out[key] = 1;\n            }\n            for (const key in n) {\n                if (!accounted_for[key]) {\n                    update[key] = n[key];\n                    accounted_for[key] = 1;\n                }\n            }\n            levels[i] = n;\n        }\n        else {\n            for (const key in o) {\n                accounted_for[key] = 1;\n            }\n        }\n    }\n    for (const key in to_null_out) {\n        if (!(key in update))\n            update[key] = undefined;\n    }\n    return update;\n}\nfunction get_spread_object(spread_props) {\n    return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n    'allowfullscreen',\n    'allowpaymentrequest',\n    'async',\n    'autofocus',\n    'autoplay',\n    'checked',\n    'controls',\n    'default',\n    'defer',\n    'disabled',\n    'formnovalidate',\n    'hidden',\n    'ismap',\n    'loop',\n    'multiple',\n    'muted',\n    'nomodule',\n    'novalidate',\n    'open',\n    'playsinline',\n    'readonly',\n    'required',\n    'reversed',\n    'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n    const attributes = Object.assign({}, ...args);\n    if (classes_to_add) {\n        if (attributes.class == null) {\n            attributes.class = classes_to_add;\n        }\n        else {\n            attributes.class += ' ' + classes_to_add;\n        }\n    }\n    let str = '';\n    Object.keys(attributes).forEach(name => {\n        if (invalid_attribute_name_character.test(name))\n            return;\n        const value = attributes[name];\n        if (value === true)\n            str += ' ' + name;\n        else if (boolean_attributes.has(name.toLowerCase())) {\n            if (value)\n                str += ' ' + name;\n        }\n        else if (value != null) {\n            str += ` ${name}=\"${value}\"`;\n        }\n    });\n    return str;\n}\nconst escaped = {\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;'\n};\nfunction escape(html) {\n    return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction escape_attribute_value(value) {\n    return typeof value === 'string' ? escape(value) : value;\n}\nfunction escape_object(obj) {\n    const result = {};\n    for (const key in obj) {\n        result[key] = escape_attribute_value(obj[key]);\n    }\n    return result;\n}\nfunction each(items, fn) {\n    let str = '';\n    for (let i = 0; i < items.length; i += 1) {\n        str += fn(items[i], i);\n    }\n    return str;\n}\nconst missing_component = {\n    $$render: () => ''\n};\nfunction validate_component(component, name) {\n    if (!component || !component.$$render) {\n        if (name === 'svelte:component')\n            name += ' this={...}';\n        throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n    }\n    return component;\n}\nfunction debug(file, line, column, values) {\n    console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n    console.log(values); // eslint-disable-line no-console\n    return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n    function $$render(result, props, bindings, slots, context) {\n        const parent_component = current_component;\n        const $$ = {\n            on_destroy,\n            context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n            // these will be immediately discarded\n            on_mount: [],\n            before_update: [],\n            after_update: [],\n            callbacks: blank_object()\n        };\n        set_current_component({ $$ });\n        const html = fn(result, props, bindings, slots);\n        set_current_component(parent_component);\n        return html;\n    }\n    return {\n        render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n            on_destroy = [];\n            const result = { title: '', head: '', css: new Set() };\n            const html = $$render(result, props, {}, $$slots, context);\n            run_all(on_destroy);\n            return {\n                html,\n                css: {\n                    code: Array.from(result.css).map(css => css.code).join('\\n'),\n                    map: null // TODO\n                },\n                head: result.title + result.head\n            };\n        },\n        $$render\n    };\n}\nfunction add_attribute(name, value, boolean) {\n    if (value == null || (boolean && !value))\n        return '';\n    return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n    return classes ? ` class=\"${classes}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n    const index = component.$$.props[name];\n    if (index !== undefined) {\n        component.$$.bound[index] = callback;\n        callback(component.$$.ctx[index]);\n    }\n}\nfunction create_component(block) {\n    block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n    block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n    const { fragment, on_mount, on_destroy, after_update } = component.$$;\n    fragment && fragment.m(target, anchor);\n    if (!customElement) {\n        // onMount happens before the initial afterUpdate\n        add_render_callback(() => {\n            const new_on_destroy = on_mount.map(run).filter(is_function);\n            if (on_destroy) {\n                on_destroy.push(...new_on_destroy);\n            }\n            else {\n                // Edge case - component was destroyed immediately,\n                // most likely as a result of a binding initialising\n                run_all(new_on_destroy);\n            }\n            component.$$.on_mount = [];\n        });\n    }\n    after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n    const $$ = component.$$;\n    if ($$.fragment !== null) {\n        run_all($$.on_destroy);\n        $$.fragment && $$.fragment.d(detaching);\n        // TODO null out other refs, including component.$$ (but need to\n        // preserve final state?)\n        $$.on_destroy = $$.fragment = null;\n        $$.ctx = [];\n    }\n}\nfunction make_dirty(component, i) {\n    if (component.$$.dirty[0] === -1) {\n        dirty_components.push(component);\n        schedule_update();\n        component.$$.dirty.fill(0);\n    }\n    component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n    const parent_component = current_component;\n    set_current_component(component);\n    const $$ = component.$$ = {\n        fragment: null,\n        ctx: null,\n        // state\n        props,\n        update: noop,\n        not_equal,\n        bound: blank_object(),\n        // lifecycle\n        on_mount: [],\n        on_destroy: [],\n        on_disconnect: [],\n        before_update: [],\n        after_update: [],\n        context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n        // everything else\n        callbacks: blank_object(),\n        dirty,\n        skip_bound: false,\n        root: options.target || parent_component.$$.root\n    };\n    append_styles && append_styles($$.root);\n    let ready = false;\n    $$.ctx = instance\n        ? instance(component, options.props || {}, (i, ret, ...rest) => {\n            const value = rest.length ? rest[0] : ret;\n            if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n                if (!$$.skip_bound && $$.bound[i])\n                    $$.bound[i](value);\n                if (ready)\n                    make_dirty(component, i);\n            }\n            return ret;\n        })\n        : [];\n    $$.update();\n    ready = true;\n    run_all($$.before_update);\n    // `false` as a special case of no DOM component\n    $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n    if (options.target) {\n        if (options.hydrate) {\n            start_hydrating();\n            const nodes = children(options.target);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.l(nodes);\n            nodes.forEach(detach);\n        }\n        else {\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.c();\n        }\n        if (options.intro)\n            transition_in(component.$$.fragment);\n        mount_component(component, options.target, options.anchor, options.customElement);\n        end_hydrating();\n        flush();\n    }\n    set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n    SvelteElement = class extends HTMLElement {\n        constructor() {\n            super();\n            this.attachShadow({ mode: 'open' });\n        }\n        connectedCallback() {\n            const { on_mount } = this.$$;\n            this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n            // @ts-ignore todo: improve typings\n            for (const key in this.$$.slotted) {\n                // @ts-ignore todo: improve typings\n                this.appendChild(this.$$.slotted[key]);\n            }\n        }\n        attributeChangedCallback(attr, _oldValue, newValue) {\n            this[attr] = newValue;\n        }\n        disconnectedCallback() {\n            run_all(this.$$.on_disconnect);\n        }\n        $destroy() {\n            destroy_component(this, 1);\n            this.$destroy = noop;\n        }\n        $on(type, callback) {\n            // TODO should this delegate to addEventListener?\n            const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n            callbacks.push(callback);\n            return () => {\n                const index = callbacks.indexOf(callback);\n                if (index !== -1)\n                    callbacks.splice(index, 1);\n            };\n        }\n        $set($$props) {\n            if (this.$$set && !is_empty($$props)) {\n                this.$$.skip_bound = true;\n                this.$$set($$props);\n                this.$$.skip_bound = false;\n            }\n        }\n    };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n    $destroy() {\n        destroy_component(this, 1);\n        this.$destroy = noop;\n    }\n    $on(type, callback) {\n        const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n        callbacks.push(callback);\n        return () => {\n            const index = callbacks.indexOf(callback);\n            if (index !== -1)\n                callbacks.splice(index, 1);\n        };\n    }\n    $set($$props) {\n        if (this.$$set && !is_empty($$props)) {\n            this.$$.skip_bound = true;\n            this.$$set($$props);\n            this.$$.skip_bound = false;\n        }\n    }\n}\n\nfunction dispatch_dev(type, detail) {\n    document.dispatchEvent(custom_event(type, Object.assign({ version: '3.43.1' }, detail), true));\n}\nfunction append_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n    dispatch_dev('SvelteDOMRemove', { node });\n    detach(node);\n}\nfunction detach_between_dev(before, after) {\n    while (before.nextSibling && before.nextSibling !== after) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction detach_before_dev(after) {\n    while (after.previousSibling) {\n        detach_dev(after.previousSibling);\n    }\n}\nfunction detach_after_dev(before) {\n    while (before.nextSibling) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n    const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n    if (has_prevent_default)\n        modifiers.push('preventDefault');\n    if (has_stop_propagation)\n        modifiers.push('stopPropagation');\n    dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n    const dispose = listen(node, event, handler, options);\n    return () => {\n        dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n        dispose();\n    };\n}\nfunction attr_dev(node, attribute, value) {\n    attr(node, attribute, value);\n    if (value == null)\n        dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n    else\n        dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n    node[property] = value;\n    dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n    node.dataset[property] = value;\n    dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction validate_each_argument(arg) {\n    if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n        let msg = '{#each} only iterates over array-like objects.';\n        if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n            msg += ' You can use a spread to convert this iterable into an array.';\n        }\n        throw new Error(msg);\n    }\n}\nfunction validate_slots(name, slot, keys) {\n    for (const slot_key of Object.keys(slot)) {\n        if (!~keys.indexOf(slot_key)) {\n            console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n        }\n    }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n    constructor(options) {\n        if (!options || (!options.target && !options.$$inline)) {\n            throw new Error(\"'target' is a required option\");\n        }\n        super();\n    }\n    $destroy() {\n        super.$destroy();\n        this.$destroy = () => {\n            console.warn('Component was already destroyed'); // eslint-disable-line no-console\n        };\n    }\n    $capture_state() { }\n    $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n    constructor(options) {\n        super(options);\n    }\n}\nfunction loop_guard(timeout) {\n    const start = Date.now();\n    return () => {\n        if (Date.now() - start > timeout) {\n            throw new Error('Infinite loop detected');\n        }\n    };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n    return (obj !== null &&\n        typeof obj === 'object' &&\n        'constructor' in obj &&\n        obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n    Object.keys(src).forEach((key) => {\n        if (typeof target[key] === 'undefined')\n            target[key] = src[key];\n        else if (isObject(src[key]) &&\n            isObject(target[key]) &&\n            Object.keys(src[key]).length > 0) {\n            extend(target[key], src[key]);\n        }\n    });\n}\n\nconst ssrDocument = {\n    body: {},\n    addEventListener() { },\n    removeEventListener() { },\n    activeElement: {\n        blur() { },\n        nodeName: '',\n    },\n    querySelector() {\n        return null;\n    },\n    querySelectorAll() {\n        return [];\n    },\n    getElementById() {\n        return null;\n    },\n    createEvent() {\n        return {\n            initEvent() { },\n        };\n    },\n    createElement() {\n        return {\n            children: [],\n            childNodes: [],\n            style: {},\n            setAttribute() { },\n            getElementsByTagName() {\n                return [];\n            },\n        };\n    },\n    createElementNS() {\n        return {};\n    },\n    importNode() {\n        return null;\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n};\nfunction getDocument() {\n    const doc = typeof document !== 'undefined' ? document : {};\n    extend(doc, ssrDocument);\n    return doc;\n}\n\nconst ssrWindow = {\n    document: ssrDocument,\n    navigator: {\n        userAgent: '',\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n    history: {\n        replaceState() { },\n        pushState() { },\n        go() { },\n        back() { },\n    },\n    CustomEvent: function CustomEvent() {\n        return this;\n    },\n    addEventListener() { },\n    removeEventListener() { },\n    getComputedStyle() {\n        return {\n            getPropertyValue() {\n                return '';\n            },\n        };\n    },\n    Image() { },\n    Date() { },\n    screen: {},\n    setTimeout() { },\n    clearTimeout() { },\n    matchMedia() {\n        return {};\n    },\n    requestAnimationFrame(callback) {\n        if (typeof setTimeout === 'undefined') {\n            callback();\n            return null;\n        }\n        return setTimeout(callback, 0);\n    },\n    cancelAnimationFrame(id) {\n        if (typeof setTimeout === 'undefined') {\n            return;\n        }\n        clearTimeout(id);\n    },\n};\nfunction getWindow() {\n    const win = typeof window !== 'undefined' ? window : {};\n    extend(win, ssrWindow);\n    return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n  const proto = obj.__proto__;\n  Object.defineProperty(obj, '__proto__', {\n    get() {\n      return proto;\n    },\n\n    set(value) {\n      proto.__proto__ = value;\n    }\n\n  });\n}\n\nclass Dom7 extends Array {\n  constructor(items) {\n    super(...(items || []));\n    makeReactive(this);\n  }\n\n}\n\nfunction arrayFlat(arr = []) {\n  const res = [];\n  arr.forEach(el => {\n    if (Array.isArray(el)) {\n      res.push(...arrayFlat(el));\n    } else {\n      res.push(el);\n    }\n  });\n  return res;\n}\nfunction arrayFilter(arr, callback) {\n  return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n  const uniqueArray = [];\n\n  for (let i = 0; i < arr.length; i += 1) {\n    if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n  }\n\n  return uniqueArray;\n}\nfunction toCamelCase(string) {\n  return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n  if (typeof selector !== 'string') {\n    return [selector];\n  }\n\n  const a = [];\n  const res = context.querySelectorAll(selector);\n\n  for (let i = 0; i < res.length; i += 1) {\n    a.push(res[i]);\n  }\n\n  return a;\n}\n\nfunction $(selector, context) {\n  const window = getWindow();\n  const document = getDocument();\n  let arr = [];\n\n  if (!context && selector instanceof Dom7) {\n    return selector;\n  }\n\n  if (!selector) {\n    return new Dom7(arr);\n  }\n\n  if (typeof selector === 'string') {\n    const html = selector.trim();\n\n    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n      let toCreate = 'div';\n      if (html.indexOf('<li') === 0) toCreate = 'ul';\n      if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n      if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n      if (html.indexOf('<tbody') === 0) toCreate = 'table';\n      if (html.indexOf('<option') === 0) toCreate = 'select';\n      const tempParent = document.createElement(toCreate);\n      tempParent.innerHTML = html;\n\n      for (let i = 0; i < tempParent.childNodes.length; i += 1) {\n        arr.push(tempParent.childNodes[i]);\n      }\n    } else {\n      arr = qsa(selector.trim(), context || document);\n    } // arr = qsa(selector, document);\n\n  } else if (selector.nodeType || selector === window || selector === document) {\n    arr.push(selector);\n  } else if (Array.isArray(selector)) {\n    if (selector instanceof Dom7) return selector;\n    arr = selector;\n  }\n\n  return new Dom7(arrayUnique(arr));\n}\n\n$.fn = Dom7.prototype;\n\n// eslint-disable-next-line\n\nfunction addClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.add(...classNames);\n  });\n  return this;\n}\n\nfunction removeClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.remove(...classNames);\n  });\n  return this;\n}\n\nfunction toggleClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    classNames.forEach(className => {\n      el.classList.toggle(className);\n    });\n  });\n}\n\nfunction hasClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  return arrayFilter(this, el => {\n    return classNames.filter(className => el.classList.contains(className)).length > 0;\n  }).length > 0;\n}\n\nfunction attr(attrs, value) {\n  if (arguments.length === 1 && typeof attrs === 'string') {\n    // Get attr\n    if (this[0]) return this[0].getAttribute(attrs);\n    return undefined;\n  } // Set attrs\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (arguments.length === 2) {\n      // String\n      this[i].setAttribute(attrs, value);\n    } else {\n      // Object\n      for (const attrName in attrs) {\n        this[i][attrName] = attrs[attrName];\n        this[i].setAttribute(attrName, attrs[attrName]);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction removeAttr(attr) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].removeAttribute(attr);\n  }\n\n  return this;\n}\n\nfunction prop(props, value) {\n  if (arguments.length === 1 && typeof props === 'string') {\n    // Get prop\n    if (this[0]) return this[0][props];\n  } else {\n    // Set props\n    for (let i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i][props] = value;\n      } else {\n        // Object\n        for (const propName in props) {\n          this[i][propName] = props[propName];\n        }\n      }\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction data(key, value) {\n  let el;\n\n  if (typeof value === 'undefined') {\n    el = this[0];\n    if (!el) return undefined; // Get value\n\n    if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n      return el.dom7ElementDataStorage[key];\n    }\n\n    const dataKey = el.getAttribute(`data-${key}`);\n\n    if (dataKey) {\n      return dataKey;\n    }\n\n    return undefined;\n  } // Set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    el = this[i];\n    if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n    el.dom7ElementDataStorage[key] = value;\n  }\n\n  return this;\n}\n\nfunction removeData(key) {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n      el.dom7ElementDataStorage[key] = null;\n      delete el.dom7ElementDataStorage[key];\n    }\n  }\n}\n\nfunction dataset() {\n  const el = this[0];\n  if (!el) return undefined;\n  const dataset = {}; // eslint-disable-line\n\n  if (el.dataset) {\n    for (const dataKey in el.dataset) {\n      dataset[dataKey] = el.dataset[dataKey];\n    }\n  } else {\n    for (let i = 0; i < el.attributes.length; i += 1) {\n      const attr = el.attributes[i];\n\n      if (attr.name.indexOf('data-') >= 0) {\n        dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n      }\n    }\n  }\n\n  for (const key in dataset) {\n    if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n  }\n\n  return dataset;\n}\n\nfunction val(value) {\n  if (typeof value === 'undefined') {\n    // get value\n    const el = this[0];\n    if (!el) return undefined;\n\n    if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n      const values = [];\n\n      for (let i = 0; i < el.selectedOptions.length; i += 1) {\n        values.push(el.selectedOptions[i].value);\n      }\n\n      return values;\n    }\n\n    return el.value;\n  } // set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n      for (let j = 0; j < el.options.length; j += 1) {\n        el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n      }\n    } else {\n      el.value = value;\n    }\n  }\n\n  return this;\n}\n\nfunction value(value) {\n  return this.val(value);\n}\n\nfunction transform(transform) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transform = transform;\n  }\n\n  return this;\n}\n\nfunction transition(duration) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n  }\n\n  return this;\n}\n\nfunction on(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n\n  function handleLiveEvent(e) {\n    const target = e.target;\n    if (!target) return;\n    const eventData = e.target.dom7EventData || [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n      const parents = $(target).parents(); // eslint-disable-line\n\n      for (let k = 0; k < parents.length; k += 1) {\n        if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n      }\n    }\n  }\n\n  function handleEvent(e) {\n    const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    listener.apply(this, eventData);\n  }\n\n  const events = eventType.split(' ');\n  let j;\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (!targetSelector) {\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7Listeners) el.dom7Listeners = {};\n        if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n        el.dom7Listeners[event].push({\n          listener,\n          proxyListener: handleEvent\n        });\n        el.addEventListener(event, handleEvent, capture);\n      }\n    } else {\n      // Live events\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n        if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n        el.dom7LiveListeners[event].push({\n          listener,\n          proxyListener: handleLiveEvent\n        });\n        el.addEventListener(event, handleLiveEvent, capture);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction off(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n  const events = eventType.split(' ');\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n      let handlers;\n\n      if (!targetSelector && el.dom7Listeners) {\n        handlers = el.dom7Listeners[event];\n      } else if (targetSelector && el.dom7LiveListeners) {\n        handlers = el.dom7LiveListeners[event];\n      }\n\n      if (handlers && handlers.length) {\n        for (let k = handlers.length - 1; k >= 0; k -= 1) {\n          const handler = handlers[k];\n\n          if (listener && handler.listener === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (!listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          }\n        }\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction once(...args) {\n  const dom = this;\n  let [eventName, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventName, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  function onceHandler(...eventArgs) {\n    listener.apply(this, eventArgs);\n    dom.off(eventName, targetSelector, onceHandler, capture);\n\n    if (onceHandler.dom7proxy) {\n      delete onceHandler.dom7proxy;\n    }\n  }\n\n  onceHandler.dom7proxy = listener;\n  return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n  const window = getWindow();\n  const events = args[0].split(' ');\n  const eventData = args[1];\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n\n      if (window.CustomEvent) {\n        const evt = new window.CustomEvent(event, {\n          detail: eventData,\n          bubbles: true,\n          cancelable: true\n        });\n        el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction transitionEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction animationEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('animationend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('animationend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction width() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerWidth;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('width'));\n  }\n\n  return null;\n}\n\nfunction outerWidth(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n    }\n\n    return this[0].offsetWidth;\n  }\n\n  return null;\n}\n\nfunction height() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerHeight;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('height'));\n  }\n\n  return null;\n}\n\nfunction outerHeight(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n    }\n\n    return this[0].offsetHeight;\n  }\n\n  return null;\n}\n\nfunction offset() {\n  if (this.length > 0) {\n    const window = getWindow();\n    const document = getDocument();\n    const el = this[0];\n    const box = el.getBoundingClientRect();\n    const body = document.body;\n    const clientTop = el.clientTop || body.clientTop || 0;\n    const clientLeft = el.clientLeft || body.clientLeft || 0;\n    const scrollTop = el === window ? window.scrollY : el.scrollTop;\n    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n    return {\n      top: box.top + scrollTop - clientTop,\n      left: box.left + scrollLeft - clientLeft\n    };\n  }\n\n  return null;\n}\n\nfunction hide() {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.display = 'none';\n  }\n\n  return this;\n}\n\nfunction show() {\n  const window = getWindow();\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.style.display === 'none') {\n      el.style.display = '';\n    }\n\n    if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n      // Still not visible\n      el.style.display = 'block';\n    }\n  }\n\n  return this;\n}\n\nfunction styles() {\n  const window = getWindow();\n  if (this[0]) return window.getComputedStyle(this[0], null);\n  return {};\n}\n\nfunction css(props, value) {\n  const window = getWindow();\n  let i;\n\n  if (arguments.length === 1) {\n    if (typeof props === 'string') {\n      // .css('width')\n      if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n    } else {\n      // .css({ width: '100px' })\n      for (i = 0; i < this.length; i += 1) {\n        for (const prop in props) {\n          this[i].style[prop] = props[prop];\n        }\n      }\n\n      return this;\n    }\n  }\n\n  if (arguments.length === 2 && typeof props === 'string') {\n    // .css('width', '100px')\n    for (i = 0; i < this.length; i += 1) {\n      this[i].style[props] = value;\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction each(callback) {\n  if (!callback) return this;\n  this.forEach((el, index) => {\n    callback.apply(el, [el, index]);\n  });\n  return this;\n}\n\nfunction filter(callback) {\n  const result = arrayFilter(this, callback);\n  return $(result);\n}\n\nfunction html(html) {\n  if (typeof html === 'undefined') {\n    return this[0] ? this[0].innerHTML : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].innerHTML = html;\n  }\n\n  return this;\n}\n\nfunction text(text) {\n  if (typeof text === 'undefined') {\n    return this[0] ? this[0].textContent.trim() : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].textContent = text;\n  }\n\n  return this;\n}\n\nfunction is(selector) {\n  const window = getWindow();\n  const document = getDocument();\n  const el = this[0];\n  let compareWith;\n  let i;\n  if (!el || typeof selector === 'undefined') return false;\n\n  if (typeof selector === 'string') {\n    if (el.matches) return el.matches(selector);\n    if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n    if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n    compareWith = $(selector);\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  if (selector === document) {\n    return el === document;\n  }\n\n  if (selector === window) {\n    return el === window;\n  }\n\n  if (selector.nodeType || selector instanceof Dom7) {\n    compareWith = selector.nodeType ? [selector] : selector;\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  return false;\n}\n\nfunction index() {\n  let child = this[0];\n  let i;\n\n  if (child) {\n    i = 0; // eslint-disable-next-line\n\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n\n    return i;\n  }\n\n  return undefined;\n}\n\nfunction eq(index) {\n  if (typeof index === 'undefined') return this;\n  const length = this.length;\n\n  if (index > length - 1) {\n    return $([]);\n  }\n\n  if (index < 0) {\n    const returnIndex = length + index;\n    if (returnIndex < 0) return $([]);\n    return $([this[returnIndex]]);\n  }\n\n  return $([this[index]]);\n}\n\nfunction append(...els) {\n  let newChild;\n  const document = getDocument();\n\n  for (let k = 0; k < els.length; k += 1) {\n    newChild = els[k];\n\n    for (let i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        while (tempDiv.firstChild) {\n          this[i].appendChild(tempDiv.firstChild);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (let j = 0; j < newChild.length; j += 1) {\n          this[i].appendChild(newChild[j]);\n        }\n      } else {\n        this[i].appendChild(newChild);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction appendTo(parent) {\n  $(parent).append(this);\n  return this;\n}\n\nfunction prepend(newChild) {\n  const document = getDocument();\n  let i;\n  let j;\n\n  for (i = 0; i < this.length; i += 1) {\n    if (typeof newChild === 'string') {\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = newChild;\n\n      for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n        this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n      }\n    } else if (newChild instanceof Dom7) {\n      for (j = 0; j < newChild.length; j += 1) {\n        this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n      }\n    } else {\n      this[i].insertBefore(newChild, this[i].childNodes[0]);\n    }\n  }\n\n  return this;\n}\n\nfunction prependTo(parent) {\n  $(parent).prepend(this);\n  return this;\n}\n\nfunction insertBefore(selector) {\n  const before = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (before.length === 1) {\n      before[0].parentNode.insertBefore(this[i], before[0]);\n    } else if (before.length > 1) {\n      for (let j = 0; j < before.length; j += 1) {\n        before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n      }\n    }\n  }\n}\n\nfunction insertAfter(selector) {\n  const after = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (after.length === 1) {\n      after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n    } else if (after.length > 1) {\n      for (let j = 0; j < after.length; j += 1) {\n        after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n      }\n    }\n  }\n}\n\nfunction next(selector) {\n  if (this.length > 0) {\n    if (selector) {\n      if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n        return $([this[0].nextElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction nextAll(selector) {\n  const nextEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(next).is(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n\n    el = next;\n  }\n\n  return $(nextEls);\n}\n\nfunction prev(selector) {\n  if (this.length > 0) {\n    const el = this[0];\n\n    if (selector) {\n      if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n        return $([el.previousElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (el.previousElementSibling) return $([el.previousElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction prevAll(selector) {\n  const prevEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(prev).is(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n\n    el = prev;\n  }\n\n  return $(prevEls);\n}\n\nfunction siblings(selector) {\n  return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode !== null) {\n      if (selector) {\n        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n      } else {\n        parents.push(this[i].parentNode);\n      }\n    }\n  }\n\n  return $(parents);\n}\n\nfunction parents(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    let parent = this[i].parentNode; // eslint-disable-line\n\n    while (parent) {\n      if (selector) {\n        if ($(parent).is(selector)) parents.push(parent);\n      } else {\n        parents.push(parent);\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  return $(parents);\n}\n\nfunction closest(selector) {\n  let closest = this; // eslint-disable-line\n\n  if (typeof selector === 'undefined') {\n    return $([]);\n  }\n\n  if (!closest.is(selector)) {\n    closest = closest.parents(selector).eq(0);\n  }\n\n  return closest;\n}\n\nfunction find(selector) {\n  const foundElements = [];\n\n  for (let i = 0; i < this.length; i += 1) {\n    const found = this[i].querySelectorAll(selector);\n\n    for (let j = 0; j < found.length; j += 1) {\n      foundElements.push(found[j]);\n    }\n  }\n\n  return $(foundElements);\n}\n\nfunction children(selector) {\n  const children = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    const childNodes = this[i].children;\n\n    for (let j = 0; j < childNodes.length; j += 1) {\n      if (!selector || $(childNodes[j]).is(selector)) {\n        children.push(childNodes[j]);\n      }\n    }\n  }\n\n  return $(children);\n}\n\nfunction remove() {\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n  }\n\n  return this;\n}\n\nfunction detach() {\n  return this.remove();\n}\n\nfunction add(...els) {\n  const dom = this;\n  let i;\n  let j;\n\n  for (i = 0; i < els.length; i += 1) {\n    const toAdd = $(els[i]);\n\n    for (j = 0; j < toAdd.length; j += 1) {\n      dom.push(toAdd[j]);\n    }\n  }\n\n  return dom;\n}\n\nfunction empty() {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.nodeType === 1) {\n      for (let j = 0; j < el.childNodes.length; j += 1) {\n        if (el.childNodes[j].parentNode) {\n          el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n        }\n      }\n\n      el.textContent = '';\n    }\n  }\n\n  return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n  const window = getWindow();\n  let [left, top, duration, easing, callback] = args;\n\n  if (args.length === 4 && typeof easing === 'function') {\n    callback = easing;\n    [left, top, duration, callback, easing] = args;\n  }\n\n  if (typeof easing === 'undefined') easing = 'swing';\n  return this.each(function animate() {\n    const el = this;\n    let currentTop;\n    let currentLeft;\n    let maxTop;\n    let maxLeft;\n    let newTop;\n    let newLeft;\n    let scrollTop; // eslint-disable-line\n\n    let scrollLeft; // eslint-disable-line\n\n    let animateTop = top > 0 || top === 0;\n    let animateLeft = left > 0 || left === 0;\n\n    if (typeof easing === 'undefined') {\n      easing = 'swing';\n    }\n\n    if (animateTop) {\n      currentTop = el.scrollTop;\n\n      if (!duration) {\n        el.scrollTop = top;\n      }\n    }\n\n    if (animateLeft) {\n      currentLeft = el.scrollLeft;\n\n      if (!duration) {\n        el.scrollLeft = left;\n      }\n    }\n\n    if (!duration) return;\n\n    if (animateTop) {\n      maxTop = el.scrollHeight - el.offsetHeight;\n      newTop = Math.max(Math.min(top, maxTop), 0);\n    }\n\n    if (animateLeft) {\n      maxLeft = el.scrollWidth - el.offsetWidth;\n      newLeft = Math.max(Math.min(left, maxLeft), 0);\n    }\n\n    let startTime = null;\n    if (animateTop && newTop === currentTop) animateTop = false;\n    if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n    function render(time = new Date().getTime()) {\n      if (startTime === null) {\n        startTime = time;\n      }\n\n      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n      const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n      let done;\n      if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n      if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n      if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (done) {\n        if (callback) callback();\n        return;\n      }\n\n      if (animateTop) el.scrollTop = scrollTop;\n      if (animateLeft) el.scrollLeft = scrollLeft;\n      window.requestAnimationFrame(render);\n    }\n\n    window.requestAnimationFrame(render);\n  });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n  let [top, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [top, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof top === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollTop;\n    return null;\n  }\n\n  return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n  let [left, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [left, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof left === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollLeft;\n    return null;\n  }\n\n  return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n  const window = getWindow();\n  const els = this;\n  const a = {\n    props: Object.assign({}, initialProps),\n    params: Object.assign({\n      duration: 300,\n      easing: 'swing' // or 'linear'\n\n      /* Callbacks\n      begin(elements)\n      complete(elements)\n      progress(elements, complete, remaining, start, tweenValue)\n      */\n\n    }, initialParams),\n    elements: els,\n    animating: false,\n    que: [],\n\n    easingProgress(easing, progress) {\n      if (easing === 'swing') {\n        return 0.5 - Math.cos(progress * Math.PI) / 2;\n      }\n\n      if (typeof easing === 'function') {\n        return easing(progress);\n      }\n\n      return progress;\n    },\n\n    stop() {\n      if (a.frameId) {\n        window.cancelAnimationFrame(a.frameId);\n      }\n\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      a.que = [];\n    },\n\n    done(complete) {\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      if (complete) complete(els);\n\n      if (a.que.length > 0) {\n        const que = a.que.shift();\n        a.animate(que[0], que[1]);\n      }\n    },\n\n    animate(props, params) {\n      if (a.animating) {\n        a.que.push([props, params]);\n        return a;\n      }\n\n      const elements = []; // Define & Cache Initials & Units\n\n      a.elements.each((el, index) => {\n        let initialFullValue;\n        let initialValue;\n        let unit;\n        let finalValue;\n        let finalFullValue;\n        if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n        elements[index] = {\n          container: el\n        };\n        Object.keys(props).forEach(prop => {\n          initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n          initialValue = parseFloat(initialFullValue);\n          unit = initialFullValue.replace(initialValue, '');\n          finalValue = parseFloat(props[prop]);\n          finalFullValue = props[prop] + unit;\n          elements[index][prop] = {\n            initialFullValue,\n            initialValue,\n            unit,\n            finalValue,\n            finalFullValue,\n            currentValue: initialValue\n          };\n        });\n      });\n      let startTime = null;\n      let time;\n      let elementsDone = 0;\n      let propsDone = 0;\n      let done;\n      let began = false;\n      a.animating = true;\n\n      function render() {\n        time = new Date().getTime();\n        let progress;\n        let easeProgress; // let el;\n\n        if (!began) {\n          began = true;\n          if (params.begin) params.begin(els);\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        if (params.progress) {\n          // eslint-disable-next-line\n          params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n        }\n\n        elements.forEach(element => {\n          const el = element;\n          if (done || el.done) return;\n          Object.keys(props).forEach(prop => {\n            if (done || el.done) return;\n            progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n            easeProgress = a.easingProgress(params.easing, progress);\n            const {\n              initialValue,\n              finalValue,\n              unit\n            } = el[prop];\n            el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n            const currentValue = el[prop].currentValue;\n\n            if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n              el.container.style[prop] = finalValue + unit;\n              propsDone += 1;\n\n              if (propsDone === Object.keys(props).length) {\n                el.done = true;\n                elementsDone += 1;\n              }\n\n              if (elementsDone === elements.length) {\n                done = true;\n              }\n            }\n\n            if (done) {\n              a.done(params.complete);\n              return;\n            }\n\n            el.container.style[prop] = currentValue + unit;\n          });\n        });\n        if (done) return; // Then call\n\n        a.frameId = window.requestAnimationFrame(render);\n      }\n\n      a.frameId = window.requestAnimationFrame(render);\n      return a;\n    }\n\n  };\n\n  if (a.elements.length === 0) {\n    return els;\n  }\n\n  let animateInstance;\n\n  for (let i = 0; i < a.elements.length; i += 1) {\n    if (a.elements[i].dom7AnimateInstance) {\n      animateInstance = a.elements[i].dom7AnimateInstance;\n    } else a.elements[i].dom7AnimateInstance = a;\n  }\n\n  if (!animateInstance) {\n    animateInstance = a;\n  }\n\n  if (initialProps === 'stop') {\n    animateInstance.stop();\n  } else {\n    animateInstance.animate(a.props, a.params);\n  }\n\n  return els;\n}\n\nfunction stop() {\n  const els = this;\n\n  for (let i = 0; i < els.length; i += 1) {\n    if (els[i].dom7AnimateInstance) {\n      els[i].dom7AnimateInstance.stop();\n    }\n  }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n  function eventHandler(...args) {\n    if (typeof args[0] === 'undefined') {\n      for (let i = 0; i < this.length; i += 1) {\n        if (noTrigger.indexOf(name) < 0) {\n          if (name in this[i]) this[i][name]();else {\n            $(this[i]).trigger(name);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this.on(name, ...args);\n  }\n\n  return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, transform, transition, on, off, trigger, transitionEnd, outerWidth, outerHeight, styles, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, filter, remove } from 'dom7';\nconst Methods = {\n  addClass,\n  removeClass,\n  hasClass,\n  toggleClass,\n  attr,\n  removeAttr,\n  transform,\n  transition,\n  on,\n  off,\n  trigger,\n  transitionEnd,\n  outerWidth,\n  outerHeight,\n  styles,\n  offset,\n  css,\n  each,\n  html,\n  text,\n  is,\n  index,\n  eq,\n  append,\n  prepend,\n  next,\n  nextAll,\n  prev,\n  prevAll,\n  parent,\n  parents,\n  closest,\n  find,\n  children,\n  filter,\n  remove\n};\nObject.keys(Methods).forEach(methodName => {\n  Object.defineProperty($.fn, methodName, {\n    value: Methods[methodName],\n    writable: true\n  });\n});\nexport default $;","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {// no getter for object\n    }\n\n    try {\n      delete object[key];\n    } catch (e) {// something got wrong\n    }\n  });\n}\n\nfunction nextTick(callback, delay = 0) {\n  return setTimeout(callback, delay);\n}\n\nfunction now() {\n  return Date.now();\n}\n\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n\n  if (!style) {\n    style = el.style;\n  }\n\n  return style;\n}\n\nfunction getTranslate(el, axis = 'x') {\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    } // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n\n\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n\n  return curTransform || 0;\n}\n\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\n\nfunction extend(...args) {\n  const to = Object(args[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[i];\n\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n\n  return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({\n  swiper,\n  targetPosition,\n  side\n}) {\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n\n    if (startTime === null) {\n      startTime = time;\n    }\n\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n\n  animate();\n}\n\nexport { animateCSSModeScroll, deleteProps, nextTick, now, getTranslate, isObject, extend, getComputedStyle, setCSSProperty };","import { getWindow, getDocument } from 'ssr-window';\nlet support;\n\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n  return {\n    smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),\n    passiveListener: function checkPassiveListener() {\n      let supportsPassive = false;\n\n      try {\n        const opts = Object.defineProperty({}, 'passive', {\n          // eslint-disable-next-line\n          get() {\n            supportsPassive = true;\n          }\n\n        });\n        window.addEventListener('testPassiveListener', null, opts);\n      } catch (e) {// No support\n      }\n\n      return supportsPassive;\n    }(),\n    gestures: function checkGestures() {\n      return 'ongesturestart' in window;\n    }()\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n\n  return support;\n}\n\nexport { getSupport };","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\nlet deviceCached;\n\nfunction calcDevice({\n  userAgent\n} = {}) {\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n\n  let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel'; // iPadOs 13 fix\n\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  } // Android\n\n\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  } // Export object\n\n\n  return device;\n}\n\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n\n  return deviceCached;\n}\n\nexport { getDevice };","import { getWindow } from 'ssr-window';\nlet browser;\n\nfunction calcBrowser() {\n  const window = getWindow();\n\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n\n  return {\n    isSafari: isSafari(),\n    isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n\n  return browser;\n}\n\nexport { getBrowser };","/* eslint-disable no-underscore-dangle */\nexport default {\n  on(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n\n  once(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n\n      handler.apply(self, args);\n    }\n\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n\n    return self;\n  },\n\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n\n    return self;\n  },\n\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n\n};","export default function transitionEmit({\n  swiper,\n  runCallbacks,\n  direction,\n  step\n}) {\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\n  if (runCallbacks && activeIndex !== previousIndex) {\n    if (dir === 'reset') {\n      swiper.emit(`slideResetTransition${step}`);\n      return;\n    }\n\n    swiper.emit(`slideChangeTransition${step}`);\n\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js'; // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\n\nfunction closestElement(selector, base = this) {\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    return found || __closestFrom(el.getRootNode().host);\n  }\n\n  return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  const window = getWindow();\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let $targetEl = $(e.target);\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!$targetEl.closest(swiper.wrapperEl).length) return;\n  }\n\n  data.isTouchEvent = e.type === 'touchstart';\n  if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n  if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return; // change target el for shadow root component\n\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n    $targetEl = $(event.path[0]);\n  }\n\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element\n\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!$targetEl.closest(params.swipeHandler)[0]) return;\n  }\n\n  touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n  touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n    } else {\n      return;\n    }\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n\n  if (e.type !== 'touchstart') {\n    let preventDefault = true;\n    if ($targetEl.is(data.focusableElements)) preventDefault = false;\n\n    if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) {\n      document.activeElement.blur();\n    }\n\n    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n\n    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {\n      e.preventDefault();\n    }\n  }\n\n  swiper.emit('touchStart', e);\n}","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\nexport default function onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && e.type !== 'touchmove') return;\n  const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n  const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n  const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n\n  if (!swiper.allowTouchMove) {\n    // isMoved = true;\n    swiper.allowClick = false;\n\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = now();\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n      return;\n    }\n  }\n\n  if (data.isTouchEvent && document.activeElement) {\n    if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n\n  if (e.targetTouches && e.targetTouches.length > 1) return;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n\n  if (data.isScrolling) {\n    data.isTouched = false;\n    return;\n  }\n\n  if (!data.startMoving) {\n    return;\n  }\n\n  swiper.allowClick = false;\n\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n\n  if (!data.isMoved) {\n    if (params.loop && !params.cssMode) {\n      swiper.loopFix();\n    }\n\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n\n    if (swiper.animating) {\n      swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n    }\n\n    data.allowMomentumBounce = false; // Grab Cursor\n\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n\n    swiper.emit('sliderFirstMove', e);\n  }\n\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) diff = -diff;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n\n  if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n  } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  } // Directions locks\n\n\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  } // Threshold\n\n\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return; // Update active index in free mode\n\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  } // Update progress\n\n\n  swiper.updateProgress(data.currentTranslate); // Update translate\n\n  swiper.setTranslate(data.currentTranslate);\n}","import { now, nextTick } from '../../shared/utils.js';\nexport default function onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n\n  data.allowTouchCallbacks = false;\n\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  } // Return Grab Cursor\n\n\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  } // Time diff\n\n\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click\n\n  if (swiper.allowClick) {\n    swiper.updateClickedSlide(e);\n    swiper.emit('tap click', e);\n\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  } // Find current slide\n\n\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  } // Find current slide size\n\n\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(stopIndex + increment);\n      }\n\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}","export default function onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return; // Breakpoints\n\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  } // Save locks\n\n\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper; // Disable locks on resize\n\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {\n    swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n  } else {\n    swiper.slideTo(swiper.activeIndex, 0, false, true);\n  }\n\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    swiper.autoplay.run();\n  } // Return locks after resize\n\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}","export default function onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}","export default function onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  } // eslint-disable-next-line\n\n\n  if (swiper.translate === -0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, false);\n}","import { getDocument } from 'ssr-window';\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\nlet dummyEventAttached = false;\n\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const {\n    params,\n    touchEvents,\n    el,\n    wrapperEl,\n    device,\n    support\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method; // Touch Events\n\n  if (!support.touch) {\n    el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n    document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n    document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n  } else {\n    const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n    el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? {\n      passive: false,\n      capture\n    } : capture);\n    el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n\n    if (touchEvents.cancel) {\n      el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n    }\n  } // Prevent Links Clicks\n\n\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  } // Resize handler\n\n\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    support\n  } = swiper;\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n\n  swiper.onClick = onClick.bind(swiper);\n\n  if (support.touch && !dummyEventAttached) {\n    document.addEventListener('touchstart', dummyEventListener);\n    dummyEventAttached = true;\n  }\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\nexport default {\n  attachEvents,\n  detachEvents\n};","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n  const swiper = this;\n  const {\n    activeIndex,\n    initialized,\n    loopedSlides = 0,\n    params,\n    $el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters\n\n  const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    $el.addClass(`${params.containerModifierClass}grid`);\n\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      $el.addClass(`${params.containerModifierClass}grid-column`);\n    }\n\n    swiper.emitContainerClasses();\n  }\n\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n\n  extend(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (needsReLoop && initialized) {\n    swiper.loopDestroy();\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}","export default {\n  init: true,\n  direction: 'horizontal',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 0,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // Images\n  preloadImages: true,\n  updateOnImagesReady: true,\n  // loop\n  loop: false,\n  loopAdditionalSlides: 0,\n  loopedSlides: null,\n  loopFillGroupWithBlank: false,\n  loopPreventsSlide: true,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-invisible-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideDuplicateClass: 'swiper-slide-duplicate',\n  slideNextClass: 'swiper-slide-next',\n  slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n  slidePrevClass: 'swiper-slide-prev',\n  slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n  wrapperClass: 'swiper-wrapper',\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n};","import { extend } from '../shared/utils.js';\nexport default function moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        auto: true\n      };\n    }\n\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    extend(allModulesParams, obj);\n  };\n}","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\nimport eventsEmitter from './events-emitter.js';\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events,\n  breakpoints,\n  checkOverflow,\n  classes,\n  images\n};\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n\n    if (!params) params = {};\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n\n    if (params.el && $(params.el).length > 1) {\n      const swipers = [];\n      $(params.el).each(containerEl => {\n        const newParams = extend({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      });\n      return swipers;\n    } // Swiper Instance\n\n\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({\n      userAgent: params.userAgent\n    });\n    swiper.browser = getBrowser();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n\n    if (params.modules && Array.isArray(params.modules)) {\n      swiper.modules.push(...params.modules);\n    }\n\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    }); // Extend defaults with modules params\n\n    const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params\n\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params); // add event listeners\n\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    } // Save Dom lib\n\n\n    swiper.$ = $; // Extend Swiper\n\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: $(),\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEvents: function touchEvents() {\n        const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n        const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n        swiper.touchEventsTouch = {\n          start: touch[0],\n          move: touch[1],\n          end: touch[2],\n          cancel: touch[3]\n        };\n        swiper.touchEventsDesktop = {\n          start: desktop[0],\n          move: desktop[1],\n          end: desktop[2]\n        };\n        return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n      }(),\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: now(),\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        isTouchEvent: undefined,\n        startMoving: undefined\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper'); // Init\n\n    if (swiper.params.init) {\n      swiper.init();\n    } // Return app instance\n\n\n    return swiper;\n  }\n\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n\n    swiper.emit('enable');\n  }\n\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n\n    swiper.emit('disable');\n  }\n\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.each(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex].swiperSlideSize;\n      let breakLoop;\n\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n\n    return spv;\n  }\n\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper; // Breakpoints\n\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n\n    let translated;\n\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n      setTranslate();\n\n      if (swiper.params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n        translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n\n      if (!translated) {\n        setTranslate();\n      }\n    }\n\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n\n    swiper.emit('update');\n  }\n\n  changeDirection(newDirection, needUpdate = true) {\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n\n    swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.each(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n\n  mount(el) {\n    const swiper = this;\n    if (swiper.mounted) return true; // Find el\n\n    const $el = $(el || swiper.params.el);\n    el = $el[0];\n\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items\n\n        res.children = options => $el.children(options);\n\n        return res;\n      }\n\n      return $el.children(getWrapperSelector());\n    }; // Find Wrapper\n\n\n    let $wrapperEl = getWrapper();\n\n    if ($wrapperEl.length === 0 && swiper.params.createElements) {\n      const document = getDocument();\n      const wrapper = document.createElement('div');\n      $wrapperEl = $(wrapper);\n      wrapper.className = swiper.params.wrapperClass;\n      $el.append(wrapper);\n      $el.children(`.${swiper.params.slideClass}`).each(slideEl => {\n        $wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      $el,\n      el,\n      $wrapperEl,\n      wrapperEl: $wrapperEl[0],\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n      wrongRTL: $wrapperEl.css('display') === '-webkit-box'\n    });\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit'); // Set breakpoint\n\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    } // Add Classes\n\n\n    swiper.addClasses(); // Create loop\n\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    } // Update size\n\n\n    swiper.updateSize(); // Update slides\n\n    swiper.updateSlides();\n\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    } // Set Grab Cursor\n\n\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    if (swiper.params.preloadImages) {\n      swiper.preloadImages();\n    } // Slide To Initial Slide\n\n\n    if (swiper.params.loop) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    } // Attach events\n\n\n    swiper.attachEvents(); // Init Flag\n\n    swiper.initialized = true; // Emit\n\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const {\n      params,\n      $el,\n      $wrapperEl,\n      slides\n    } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n\n    swiper.emit('beforeDestroy'); // Init Flag\n\n    swiper.initialized = false; // Detach events\n\n    swiper.detachEvents(); // Destroy loop\n\n    if (params.loop) {\n      swiper.loopDestroy();\n    } // Cleanup styles\n\n\n    if (cleanStyles) {\n      swiper.removeClasses();\n      $el.removeAttr('style');\n      $wrapperEl.removeAttr('style');\n\n      if (slides && slides.length) {\n        slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');\n      }\n    }\n\n    swiper.emit('destroy'); // Detach emitter events\n\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n\n    if (deleteInstance !== false) {\n      swiper.$el[0].swiper = null;\n      deleteProps(swiper);\n    }\n\n    swiper.destroyed = true;\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return defaults;\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n\n    Swiper.installModule(module);\n    return Swiper;\n  }\n\n}\n\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([Resize, Observer]);\nexport default Swiper;","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\nexport default {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide\n};","export default function updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const $el = swiper.$el;\n\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = $el[0].clientWidth;\n  }\n\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = $el[0].clientHeight;\n  }\n\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  } // Subtract paddings\n\n\n  width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);\n  height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}","import { setCSSProperty } from '../../shared/utils.js';\nexport default function updateSlides() {\n  const swiper = this;\n\n  function getDirectionLabel(property) {\n    if (swiper.isHorizontal()) {\n      return property;\n    } // prettier-ignore\n\n\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n  const {\n    $wrapperEl,\n    size: swiperSize,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  }\n\n  swiper.virtualSize = -spaceBetween; // reset margins\n\n  if (rtl) slides.css({\n    marginLeft: '',\n    marginBottom: '',\n    marginTop: ''\n  });else slides.css({\n    marginRight: '',\n    marginBottom: '',\n    marginTop: ''\n  }); // reset cssMode offsets\n\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n\n  if (gridEnabled) {\n    swiper.grid.initSlides(slidesLength);\n  } // Calc slides\n\n\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides.eq(i);\n\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n    }\n\n    if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[getDirectionLabel('width')] = ``;\n      }\n\n      const slideStyles = getComputedStyle(slide[0]);\n      const currentTransform = slide[0].style.transform;\n      const currentWebKitTransform = slide[0].style.webkitTransform;\n\n      if (currentTransform) {\n        slide[0].style.transform = 'none';\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = 'none';\n      }\n\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide[0];\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n\n      if (currentTransform) {\n        slide[0].style.transform = currentTransform;\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = currentWebKitTransform;\n      }\n\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n      if (slides[i]) {\n        slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    $wrapperEl.css({\n      width: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (params.setWrapperSize) {\n    $wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n  } // Remove last grid elements depending on width\n\n\n  if (!params.centeredSlides) {\n    const newSlidesGrid = [];\n\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n\n      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n\n    snapGrid = newSlidesGrid;\n\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (params.spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode) return true;\n\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n\n      return true;\n    }).css({\n      [key]: `${spaceBetween}px`\n    });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n    const maxSnap = allSlidesSize - swiperSize;\n    snapGrid = snapGrid.map(snap => {\n      if (snap < 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n}","export default function updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0];\n    }\n\n    return swiper.slides.eq(index)[0];\n  }; // Find slides currently in view\n\n\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      swiper.visibleSlides.each(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  } // Find new height from highest slide in view\n\n\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  } // Update Height\n\n\n  if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}","export default function updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateSlidesProgress(translate = this && this.translate || 0) {\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate; // Visible Slides\n\n  slides.removeClass(params.slideVisibleClass);\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n      slides.eq(i).addClass(params.slideVisibleClass);\n    }\n\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n\n  swiper.visibleSlides = $(swiper.visibleSlides);\n}","export default function updateProgress(translate) {\n  const swiper = this;\n\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line\n\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    isBeginning = progress <= 0;\n    isEnd = progress >= 1;\n  }\n\n  Object.assign(swiper, {\n    progress,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n\n  swiper.emit('progress', progress);\n}","export default function updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    $wrapperEl,\n    activeIndex,\n    realIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`);\n  let activeSlide;\n\n  if (isVirtual) {\n    activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`);\n  } else {\n    activeSlide = slides.eq(activeIndex);\n  } // Active classes\n\n\n  activeSlide.addClass(params.slideActiveClass);\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (activeSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    }\n  } // Next Slide\n\n\n  let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass);\n\n  if (params.loop && nextSlide.length === 0) {\n    nextSlide = slides.eq(0);\n    nextSlide.addClass(params.slideNextClass);\n  } // Prev Slide\n\n\n  let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass);\n\n  if (params.loop && prevSlide.length === 0) {\n    prevSlide = slides.eq(-1);\n    prevSlide.addClass(params.slidePrevClass);\n  }\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (nextSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    }\n\n    if (prevSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    }\n  }\n\n  swiper.emitSlidesClasses();\n}","export default function updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    slidesGrid,\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n\n  if (typeof activeIndex === 'undefined') {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n          activeIndex = i;\n        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n          activeIndex = i + 1;\n        }\n      } else if (translate >= slidesGrid[i]) {\n        activeIndex = i;\n      }\n    } // Normalize slideIndex\n\n\n    if (params.normalizeSlideIndex) {\n      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n    }\n  }\n\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if (activeIndex === previousIndex) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n\n    return;\n  } // Get real index\n\n\n  const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n  Object.assign(swiper, {\n    snapIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n\n  if (previousRealIndex !== realIndex) {\n    swiper.emit('realIndexChange');\n  }\n\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    swiper.emit('slideChange');\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateClickedSlide(e) {\n  const swiper = this;\n  const params = swiper.params;\n  const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n  let slideFound = false;\n  let slideIndex;\n\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\nexport default {\n  getTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo\n};","import { getTranslate } from '../../shared/utils.js';\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    $wrapperEl\n  } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = getTranslate($wrapperEl[0], axis);\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}","export default function setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    $wrapperEl,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n  }\n\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress\n\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, byController);\n}","export default function minTranslate() {\n  return -this.snapGrid[0];\n}","export default function maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress\n\n  swiper.updateProgress(newTranslate);\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\nexport default {\n  setTransition,\n  transitionStart,\n  transitionEnd\n};","export default function setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.$wrapperEl.transition(duration);\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\nexport default {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide\n};","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) {\n  if (typeof index !== 'number' && typeof index !== 'string') {\n    throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`);\n  }\n\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`);\n    } // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n\n\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {\n    return false;\n  }\n\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  const translate = -snapGrid[snapIndex]; // Update progress\n\n  swiper.updateProgress(translate); // Normalize slideIndex\n\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  } // Directions locks\n\n\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n      return false;\n    }\n\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) return false;\n    }\n  }\n\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index\n\n  if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n    swiper.updateActiveIndex(slideIndex); // Update Height\n\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n\n    swiper.updateSlidesClasses();\n\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n\n    return false;\n  }\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n\n    if (speed === 0) {\n      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._swiperImmediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(translate);\n    swiper.updateActiveIndex(slideIndex);\n    swiper.updateSlidesClasses();\n    swiper.emit('beforeTransitionStart', speed, internal);\n    swiper.transitionStart(runCallbacks, direction);\n    swiper.transitionEnd(runCallbacks, direction);\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(translate);\n    swiper.updateActiveIndex(slideIndex);\n    swiper.updateSlidesClasses();\n    swiper.emit('beforeTransitionStart', speed, internal);\n    swiper.transitionStart(runCallbacks, direction);\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onSlideToWrapperTransitionEnd) {\n        swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n          swiper.onSlideToWrapperTransitionEnd = null;\n          delete swiper.onSlideToWrapperTransitionEnd;\n          swiper.transitionEnd(runCallbacks, direction);\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}","export default function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  let newIndex = index;\n\n  if (swiper.params.loop) {\n    newIndex += swiper.loopedSlides;\n  }\n\n  return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    animating,\n    enabled,\n    params\n  } = swiper;\n  if (!enabled) return swiper;\n  let perGroup = params.slidesPerGroup;\n\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    animating,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return swiper;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n\n  if (typeof prevSnap === 'undefined' && params.cssMode) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n\n  let prevIndex = 0;\n\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) {\n  const swiper = this;\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nexport default function slideToClickedSlide() {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n\n    if (params.centeredSlides) {\n      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n        nextTick(() => {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n      swiper.loopFix();\n      slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\nexport default {\n  loopCreate,\n  loopFix,\n  loopDestroy\n};","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loopCreate() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    $wrapperEl\n  } = swiper; // Remove duplicated slides\n\n  const $selector = $($wrapperEl.children()[0].parentNode);\n  $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n  let slides = $selector.children(`.${params.slideClass}`);\n\n  if (params.loopFillGroupWithBlank) {\n    const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;\n\n    if (blankSlidesNum !== params.slidesPerGroup) {\n      for (let i = 0; i < blankSlidesNum; i += 1) {\n        const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`);\n        $selector.append(blankNode);\n      }\n\n      slides = $selector.children(`.${params.slideClass}`);\n    }\n  }\n\n  if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n  swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n  swiper.loopedSlides += params.loopAdditionalSlides;\n\n  if (swiper.loopedSlides > slides.length) {\n    swiper.loopedSlides = slides.length;\n  }\n\n  const prependSlides = [];\n  const appendSlides = [];\n  slides.each((el, index) => {\n    const slide = $(el);\n\n    if (index < swiper.loopedSlides) {\n      appendSlides.push(el);\n    }\n\n    if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n      prependSlides.push(el);\n    }\n\n    slide.attr('data-swiper-slide-index', index);\n  });\n\n  for (let i = 0; i < appendSlides.length; i += 1) {\n    $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n\n  for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n    $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n}","export default function loopFix() {\n  const swiper = this;\n  swiper.emit('beforeLoopFix');\n  const {\n    activeIndex,\n    slides,\n    loopedSlides,\n    allowSlidePrev,\n    allowSlideNext,\n    snapGrid,\n    rtlTranslate: rtl\n  } = swiper;\n  let newIndex;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  const snapTranslate = -snapGrid[activeIndex];\n  const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding\n\n  if (activeIndex < loopedSlides) {\n    newIndex = slides.length - loopedSlides * 3 + activeIndex;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  } else if (activeIndex >= slides.length - loopedSlides) {\n    // Fix For Positive Oversliding\n    newIndex = -slides.length + activeIndex + loopedSlides;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  }\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  swiper.emit('loopFix');\n}","export default function loopDestroy() {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params,\n    slides\n  } = swiper;\n  $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove();\n  slides.removeAttr('data-swiper-slide-index');\n}","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\nexport default {\n  setGrabCursor,\n  unsetGrabCursor\n};","export default function setGrabCursor(moving) {\n  const swiper = this;\n  if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n  el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n}","export default function unsetGrabCursor() {\n  const swiper = this;\n\n  if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\nexport default {\n  setBreakpoint,\n  getBreakpoint\n};","import { getWindow } from 'ssr-window';\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n\n  return breakpoint || 'max';\n}","function checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\n\nexport default {\n  checkOverflow\n};","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\nexport default {\n  addClasses,\n  removeClasses\n};","function prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\n\nexport default function addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    $el,\n    device,\n    support\n  } = swiper; // prettier-ignore\n\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'pointer-events': !support.touch\n  }, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  $el.addClass([...classNames].join(' '));\n  swiper.emitContainerClasses();\n}","export default function removeClasses() {\n  const swiper = this;\n  const {\n    $el,\n    classNames\n  } = swiper;\n  $el.removeClass(classNames.join(' '));\n  swiper.emitContainerClasses();\n}","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\nexport default {\n  loadImage,\n  preloadImages\n};","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n  const window = getWindow();\n  let image;\n\n  function onReady() {\n    if (callback) callback();\n  }\n\n  const isPicture = $(imageEl).parent('picture')[0];\n\n  if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n    if (src) {\n      image = new window.Image();\n      image.onload = onReady;\n      image.onerror = onReady;\n\n      if (sizes) {\n        image.sizes = sizes;\n      }\n\n      if (srcset) {\n        image.srcset = srcset;\n      }\n\n      if (src) {\n        image.src = src;\n      }\n    } else {\n      onReady();\n    }\n  } else {\n    // image already loaded...\n    onReady();\n  }\n}","export default function preloadImages() {\n  const swiper = this;\n  swiper.imagesToLoad = swiper.$el.find('img');\n\n  function onReady() {\n    if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n    if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n\n    if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n      if (swiper.params.updateOnImagesReady) swiper.update();\n      swiper.emit('imagesReady');\n    }\n  }\n\n  for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n    const imageEl = swiper.imagesToLoad[i];\n    swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);\n  }\n}","import { getDocument } from 'ssr-window';\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  const document = getDocument();\n\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n\n        if (!element) {\n          element = document.createElement('div');\n          element.className = checkProps[key];\n          swiper.$el.append(element);\n        }\n\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n\n  return params;\n}","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\nexport default function Navigation({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock'\n    }\n  });\n  swiper.navigation = {\n    nextEl: null,\n    $nextEl: null,\n    prevEl: null,\n    $prevEl: null\n  };\n\n  function getEl(el) {\n    let $el;\n\n    if (el) {\n      $el = $(el);\n\n      if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) {\n        $el = swiper.$el.find(el);\n      }\n    }\n\n    return $el;\n  }\n\n  function toggleEl($el, disabled) {\n    const params = swiper.params.navigation;\n\n    if ($el && $el.length > 0) {\n      $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n      if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n    }\n  }\n\n  function update() {\n    // Update Navigation Buttons\n    if (swiper.params.loop) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    toggleEl($prevEl, swiper.isBeginning);\n    toggleEl($nextEl, swiper.isEnd);\n  }\n\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop) return;\n    swiper.slidePrev();\n  }\n\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop) return;\n    swiper.slideNext();\n  }\n\n  function init() {\n    const params = swiper.params.navigation;\n    swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n      nextEl: 'swiper-button-next',\n      prevEl: 'swiper-button-prev'\n    });\n    if (!(params.nextEl || params.prevEl)) return;\n    const $nextEl = getEl(params.nextEl);\n    const $prevEl = getEl(params.prevEl);\n\n    if ($nextEl && $nextEl.length > 0) {\n      $nextEl.on('click', onNextClick);\n    }\n\n    if ($prevEl && $prevEl.length > 0) {\n      $prevEl.on('click', onPrevClick);\n    }\n\n    Object.assign(swiper.navigation, {\n      $nextEl,\n      nextEl: $nextEl && $nextEl[0],\n      $prevEl,\n      prevEl: $prevEl && $prevEl[0]\n    });\n\n    if (!swiper.enabled) {\n      if ($nextEl) $nextEl.addClass(params.lockClass);\n      if ($prevEl) $prevEl.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl && $nextEl.length) {\n      $nextEl.off('click', onNextClick);\n      $nextEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      $prevEl.off('click', onPrevClick);\n      $prevEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n  }\n\n  on('init', () => {\n    init();\n    update();\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl) {\n      $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n\n    if ($prevEl) {\n      $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n  });\n  on('click', (_s, e) => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    const targetEl = e.target;\n\n    if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) {\n      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n      let isHidden;\n\n      if ($nextEl) {\n        isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n      } else if ($prevEl) {\n        isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n\n      if ($nextEl) {\n        $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if ($prevEl) {\n        $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n    }\n  });\n  Object.assign(swiper.navigation, {\n    update,\n    init,\n    destroy\n  });\n}","export default function classesToSelector(classes = '') {\n  return `.${classes.trim().replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nexport default function Pagination({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets',\n      // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: number => number,\n      formatFractionTotal: number => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`\n    }\n  });\n  swiper.pagination = {\n    el: null,\n    $el: null,\n    bullets: []\n  };\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0;\n  }\n\n  function setSideBullets($bulletEl, position) {\n    const {\n      bulletActiveClass\n    } = swiper.params.pagination;\n    $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`);\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el; // Current/Total\n\n    let current;\n    const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n    if (swiper.params.loop) {\n      current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n\n      if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n        current -= slidesLength - swiper.loopedSlides * 2;\n      }\n\n      if (current > total - 1) current -= total;\n      if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n    } else {\n      current = swiper.activeIndex || 0;\n    } // Types\n\n\n    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n\n      if (params.dynamicBullets) {\n        bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n        $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`);\n\n        if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n          dynamicBulletIndex += current - swiper.previousIndex;\n\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n\n        firstIndex = current - dynamicBulletIndex;\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n\n      bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' '));\n\n      if ($el.length > 1) {\n        bullets.each(bullet => {\n          const $bullet = $(bullet);\n          const bulletIndex = $bullet.index();\n\n          if (bulletIndex === current) {\n            $bullet.addClass(params.bulletActiveClass);\n          }\n\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              $bullet.addClass(`${params.bulletActiveClass}-main`);\n            }\n\n            if (bulletIndex === firstIndex) {\n              setSideBullets($bullet, 'prev');\n            }\n\n            if (bulletIndex === lastIndex) {\n              setSideBullets($bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const $bullet = bullets.eq(current);\n        const bulletIndex = $bullet.index();\n        $bullet.addClass(params.bulletActiveClass);\n\n        if (params.dynamicBullets) {\n          const $firstDisplayedBullet = bullets.eq(firstIndex);\n          const $lastDisplayedBullet = bullets.eq(lastIndex);\n\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n          }\n\n          if (swiper.params.loop) {\n            if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n              for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n                bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n              }\n\n              bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`);\n            } else {\n              setSideBullets($firstDisplayedBullet, 'prev');\n              setSideBullets($lastDisplayedBullet, 'next');\n            }\n          } else {\n            setSideBullets($firstDisplayedBullet, 'prev');\n            setSideBullets($lastDisplayedBullet, 'next');\n          }\n        }\n      }\n\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n      }\n    }\n\n    if (params.type === 'fraction') {\n      $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1));\n      $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n    }\n\n    if (params.type === 'progressbar') {\n      let progressbarDirection;\n\n      if (params.progressbarOpposite) {\n        progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n      } else {\n        progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n      }\n\n      const scale = (current + 1) / total;\n      let scaleX = 1;\n      let scaleY = 1;\n\n      if (progressbarDirection === 'horizontal') {\n        scaleX = scale;\n      } else {\n        scaleY = scale;\n      }\n\n      $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed);\n    }\n\n    if (params.type === 'custom' && params.renderCustom) {\n      $el.html(params.renderCustom(swiper, current + 1, total));\n      emit('paginationRender', $el[0]);\n    } else {\n      emit('paginationUpdate', $el[0]);\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    }\n  }\n\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el;\n    let paginationHTML = '';\n\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n      if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) {\n        numberOfBullets = slidesLength;\n      }\n\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n\n      $el.html(paginationHTML);\n      swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n    }\n\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML = `<span class=\"${params.currentClass}\"></span>` + ' / ' + `<span class=\"${params.totalClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type !== 'custom') {\n      emit('paginationRender', swiper.pagination.$el[0]);\n    }\n  }\n\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n      el: 'swiper-pagination'\n    });\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let $el = $(params.el);\n    if ($el.length === 0) return;\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n      $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper\n\n      if ($el.length > 1) {\n        $el = $el.filter(el => {\n          if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n\n    if (params.type === 'bullets' && params.clickable) {\n      $el.addClass(params.clickableClass);\n    }\n\n    $el.addClass(params.modifierClass + params.type);\n    $el.addClass(params.modifierClass + swiper.params.direction);\n\n    if (params.type === 'bullets' && params.dynamicBullets) {\n      $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n      dynamicBulletIndex = 0;\n\n      if (params.dynamicMainBullets < 1) {\n        params.dynamicMainBullets = 1;\n      }\n    }\n\n    if (params.type === 'progressbar' && params.progressbarOpposite) {\n      $el.addClass(params.progressbarOppositeClass);\n    }\n\n    if (params.clickable) {\n      $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n        e.preventDefault();\n        let index = $(this).index() * swiper.params.slidesPerGroup;\n        if (swiper.params.loop) index += swiper.loopedSlides;\n        swiper.slideTo(index);\n      });\n    }\n\n    Object.assign(swiper.pagination, {\n      $el,\n      el: $el[0]\n    });\n\n    if (!swiper.enabled) {\n      $el.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const $el = swiper.pagination.$el;\n    $el.removeClass(params.hiddenClass);\n    $el.removeClass(params.modifierClass + params.type);\n    $el.removeClass(params.modifierClass + swiper.params.direction);\n    if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n\n    if (params.clickable) {\n      $el.off('click', classesToSelector(params.bulletClass));\n    }\n  }\n\n  on('init', () => {\n    init();\n    render();\n    update();\n  });\n  on('activeIndexChange', () => {\n    if (swiper.params.loop) {\n      update();\n    } else if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    if (!swiper.params.loop) {\n      update();\n    }\n  });\n  on('slidesLengthChange', () => {\n    if (swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('snapGridLengthChange', () => {\n    if (!swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.pagination;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const {\n      $el\n    } = swiper.pagination;\n\n    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) {\n      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n      const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n\n      $el.toggleClass(swiper.params.pagination.hiddenClass);\n    }\n  });\n  Object.assign(swiper.pagination, {\n    render,\n    update,\n    init,\n    destroy\n  });\n}","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nexport default function Scrollbar({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = getDocument();\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag'\n    }\n  });\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null,\n    $el: null,\n    $dragEl: null\n  };\n\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar,\n      rtlTranslate: rtl,\n      progress\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    const params = swiper.params.scrollbar;\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n\n    if (rtl) {\n      newPos = -newPos;\n\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n      $dragEl[0].style.width = `${newSize}px`;\n    } else {\n      $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n      $dragEl[0].style.height = `${newSize}px`;\n    }\n\n    if (params.hide) {\n      clearTimeout(timeout);\n      $el[0].style.opacity = 1;\n      timeout = setTimeout(() => {\n        $el[0].style.opacity = 0;\n        $el.transition(400);\n      }, 1000);\n    }\n  }\n\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.$dragEl.transition(duration);\n  }\n\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    $dragEl[0].style.width = '';\n    $dragEl[0].style.height = '';\n    trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl[0].style.width = `${dragSize}px`;\n    } else {\n      $dragEl[0].style.height = `${dragSize}px`;\n    }\n\n    if (divider >= 1) {\n      $el[0].style.display = 'none';\n    } else {\n      $el[0].style.display = '';\n    }\n\n    if (swiper.params.scrollbar.hide) {\n      $el[0].style.opacity = 0;\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function getPointerPosition(e) {\n    if (swiper.isHorizontal()) {\n      return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX;\n    }\n\n    return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY;\n  }\n\n  function setDragPosition(e) {\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    let positionRatio;\n    positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n\n    const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    isTouched = true;\n    dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n    e.preventDefault();\n    e.stopPropagation();\n    $wrapperEl.transition(100);\n    $dragEl.transition(100);\n    setDragPosition(e);\n    clearTimeout(dragTimeout);\n    $el.transition(0);\n\n    if (params.hide) {\n      $el.css('opacity', 1);\n    }\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', 'none');\n    }\n\n    emit('scrollbarDragStart', e);\n  }\n\n  function onDragMove(e) {\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    if (!isTouched) return;\n    if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n    setDragPosition(e);\n    $wrapperEl.transition(0);\n    $el.transition(0);\n    $dragEl.transition(0);\n    emit('scrollbarDragMove', e);\n  }\n\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    if (!isTouched) return;\n    isTouched = false;\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', '');\n      $wrapperEl.transition('');\n    }\n\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        $el.css('opacity', 0);\n        $el.transition(400);\n      }, 1000);\n    }\n\n    emit('scrollbarDragEnd', e);\n\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n\n  function events(method) {\n    const {\n      scrollbar,\n      touchEventsTouch,\n      touchEventsDesktop,\n      params,\n      support\n    } = swiper;\n    const $el = scrollbar.$el;\n    const target = $el[0];\n    const activeListener = support.passiveListener && params.passiveListeners ? {\n      passive: false,\n      capture: false\n    } : false;\n    const passiveListener = support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n\n    if (!support.touch) {\n      target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n      document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n      document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n    } else {\n      target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n      target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n      target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n    }\n  }\n\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('on');\n  }\n\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('off');\n  }\n\n  function init() {\n    const {\n      scrollbar,\n      $el: $swiperEl\n    } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n      el: 'swiper-scrollbar'\n    });\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n    let $el = $(params.el);\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n      $el = $swiperEl.find(params.el);\n    }\n\n    let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n\n    if ($dragEl.length === 0) {\n      $dragEl = $(`<div class=\"${swiper.params.scrollbar.dragClass}\"></div>`);\n      $el.append($dragEl);\n    }\n\n    Object.assign(scrollbar, {\n      $el,\n      el: $el[0],\n      $dragEl,\n      dragEl: $dragEl[0]\n    });\n\n    if (params.draggable) {\n      enableDraggable();\n    }\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function destroy() {\n    disableDraggable();\n  }\n\n  on('init', () => {\n    init();\n    updateSize();\n    setTranslate();\n  });\n  on('update resize observerUpdate lock unlock', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.scrollbar;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  Object.assign(swiper.scrollbar, {\n    updateSize,\n    setTranslate,\n    init,\n    destroy\n  });\n}","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\nexport default function A11y({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group'\n    }\n  });\n  let liveRegion = null;\n\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    notification.html('');\n    notification.html(message);\n  }\n\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n\n  function makeElFocusable($el) {\n    $el.attr('tabIndex', '0');\n  }\n\n  function makeElNotFocusable($el) {\n    $el.attr('tabIndex', '-1');\n  }\n\n  function addElRole($el, role) {\n    $el.attr('role', role);\n  }\n\n  function addElRoleDescription($el, description) {\n    $el.attr('aria-roledescription', description);\n  }\n\n  function addElControls($el, controls) {\n    $el.attr('aria-controls', controls);\n  }\n\n  function addElLabel($el, label) {\n    $el.attr('aria-label', label);\n  }\n\n  function addElId($el, id) {\n    $el.attr('id', id);\n  }\n\n  function addElLive($el, live) {\n    $el.attr('aria-live', live);\n  }\n\n  function disableEl($el) {\n    $el.attr('aria-disabled', true);\n  }\n\n  function enableEl($el) {\n    $el.attr('aria-disabled', false);\n  }\n\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const $targetEl = $(e.target);\n\n    if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n      if (!(swiper.isEnd && !swiper.params.loop)) {\n        swiper.slideNext();\n      }\n\n      if (swiper.isEnd) {\n        notify(params.lastSlideMessage);\n      } else {\n        notify(params.nextSlideMessage);\n      }\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n      if (!(swiper.isBeginning && !swiper.params.loop)) {\n        swiper.slidePrev();\n      }\n\n      if (swiper.isBeginning) {\n        notify(params.firstSlideMessage);\n      } else {\n        notify(params.prevSlideMessage);\n      }\n    }\n\n    if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) {\n      $targetEl[0].click();\n    }\n  }\n\n  function updateNavigation() {\n    if (swiper.params.loop || !swiper.navigation) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($prevEl && $prevEl.length > 0) {\n      if (swiper.isBeginning) {\n        disableEl($prevEl);\n        makeElNotFocusable($prevEl);\n      } else {\n        enableEl($prevEl);\n        makeElFocusable($prevEl);\n      }\n    }\n\n    if ($nextEl && $nextEl.length > 0) {\n      if (swiper.isEnd) {\n        disableEl($nextEl);\n        makeElNotFocusable($nextEl);\n      } else {\n        enableEl($nextEl);\n        makeElFocusable($nextEl);\n      }\n    }\n  }\n\n  function hasPagination() {\n    return swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length;\n  }\n\n  function updatePagination() {\n    const params = swiper.params.a11y;\n\n    if (hasPagination()) {\n      swiper.pagination.bullets.each(bulletEl => {\n        const $bulletEl = $(bulletEl);\n        makeElFocusable($bulletEl);\n\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole($bulletEl, 'button');\n          addElLabel($bulletEl, params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1));\n        }\n      });\n    }\n  }\n\n  const initNavEl = ($el, wrapperId, message) => {\n    makeElFocusable($el);\n\n    if ($el[0].tagName !== 'BUTTON') {\n      addElRole($el, 'button');\n      $el.on('keydown', onEnterOrSpaceKey);\n    }\n\n    addElLabel($el, message);\n    addElControls($el, wrapperId);\n  };\n\n  function init() {\n    const params = swiper.params.a11y;\n    swiper.$el.append(liveRegion); // Container\n\n    const $containerEl = swiper.$el;\n\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n    }\n\n    if (params.containerMessage) {\n      addElLabel($containerEl, params.containerMessage);\n    } // Wrapper\n\n\n    const $wrapperEl = swiper.$wrapperEl;\n    const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n    addElId($wrapperEl, wrapperId);\n    addElLive($wrapperEl, live); // Slide\n\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n    }\n\n    addElRole($(swiper.slides), params.slideRole);\n    const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length;\n    swiper.slides.each((slideEl, index) => {\n      const $slideEl = $(slideEl);\n      const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index;\n      const ariaLabelMessage = params.slideLabelMessage.replace(/\\{\\{index\\}\\}/, slideIndex + 1).replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n      addElLabel($slideEl, ariaLabelMessage);\n    }); // Navigation\n\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl && $nextEl.length) {\n      initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n    } // Pagination\n\n\n    if (hasPagination()) {\n      swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    }\n  }\n\n  function destroy() {\n    if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl) {\n      $nextEl.off('keydown', onEnterOrSpaceKey);\n    }\n\n    if ($prevEl) {\n      $prevEl.off('keydown', onEnterOrSpaceKey);\n    } // Pagination\n\n\n    if (hasPagination()) {\n      swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    }\n  }\n\n  on('beforeInit', () => {\n    liveRegion = $(`<span class=\"${swiper.params.a11y.notificationClass}\" aria-live=\"assertive\" aria-atomic=\"true\"></span>`);\n  });\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n    updateNavigation();\n  });\n  on('toEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('fromEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}","/* eslint no-underscore-dangle: \"off\" */\n\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\nexport default function Autoplay({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  let timeout;\n  swiper.autoplay = {\n    running: false,\n    paused: false\n  };\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: true,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false\n    }\n  });\n\n  function run() {\n    const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n    let delay = swiper.params.autoplay.delay;\n\n    if ($activeSlideEl.attr('data-swiper-autoplay')) {\n      delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n    }\n\n    clearTimeout(timeout);\n    timeout = nextTick(() => {\n      let autoplayResult;\n\n      if (swiper.params.autoplay.reverseDirection) {\n        if (swiper.params.loop) {\n          swiper.loopFix();\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.isBeginning) {\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n          emit('autoplay');\n        } else {\n          stop();\n        }\n      } else if (swiper.params.loop) {\n        swiper.loopFix();\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.isEnd) {\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.params.autoplay.stopOnLastSlide) {\n        autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n        emit('autoplay');\n      } else {\n        stop();\n      }\n\n      if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) {\n        run();\n      }\n    }, delay);\n  }\n\n  function start() {\n    if (typeof timeout !== 'undefined') return false;\n    if (swiper.autoplay.running) return false;\n    swiper.autoplay.running = true;\n    emit('autoplayStart');\n    run();\n    return true;\n  }\n\n  function stop() {\n    if (!swiper.autoplay.running) return false;\n    if (typeof timeout === 'undefined') return false;\n\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = undefined;\n    }\n\n    swiper.autoplay.running = false;\n    emit('autoplayStop');\n    return true;\n  }\n\n  function pause(speed) {\n    if (!swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) return;\n    if (timeout) clearTimeout(timeout);\n    swiper.autoplay.paused = true;\n\n    if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n      swiper.autoplay.paused = false;\n      run();\n    } else {\n      ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n        swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n      });\n    }\n  }\n\n  function onVisibilityChange() {\n    const document = getDocument();\n\n    if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n      pause();\n    }\n\n    if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n      run();\n      swiper.autoplay.paused = false;\n    }\n  }\n\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n    if (e.target !== swiper.$wrapperEl[0]) return;\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n    swiper.autoplay.paused = false;\n\n    if (!swiper.autoplay.running) {\n      stop();\n    } else {\n      run();\n    }\n  }\n\n  function onMouseEnter() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n    } else {\n      pause();\n    }\n\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n  }\n\n  function onMouseLeave() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      return;\n    }\n\n    swiper.autoplay.paused = false;\n    run();\n  }\n\n  function attachMouseEvents() {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.$el.on('mouseenter', onMouseEnter);\n      swiper.$el.on('mouseleave', onMouseLeave);\n    }\n  }\n\n  function detachMouseEvents() {\n    swiper.$el.off('mouseenter', onMouseEnter);\n    swiper.$el.off('mouseleave', onMouseLeave);\n  }\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      start();\n      const document = getDocument();\n      document.addEventListener('visibilitychange', onVisibilityChange);\n      attachMouseEvents();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.autoplay.running) {\n      if (internal || !swiper.params.autoplay.disableOnInteraction) {\n        swiper.autoplay.pause(speed);\n      } else {\n        stop();\n      }\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.autoplay.running) {\n      if (swiper.params.autoplay.disableOnInteraction) {\n        stop();\n      } else {\n        pause();\n      }\n    }\n  });\n  on('touchEnd', () => {\n    if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {\n      run();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n\n    if (swiper.autoplay.running) {\n      stop();\n    }\n\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  });\n  Object.assign(swiper.autoplay, {\n    pause,\n    run,\n    start,\n    stop\n  });\n}","function isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction extend(target, src) {\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {\n    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n      if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]);\n    } else {\n      target[key] = src[key];\n    }\n  });\n}\n\nfunction needsNavigation(params = {}) {\n  return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined';\n}\n\nfunction needsPagination(params = {}) {\n  return params.pagination && typeof params.pagination.el === 'undefined';\n}\n\nfunction needsScrollbar(params = {}) {\n  return params.scrollbar && typeof params.scrollbar.el === 'undefined';\n}\n\nfunction uniqueClasses(classNames = '') {\n  const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c);\n  const unique = [];\n  classes.forEach(c => {\n    if (unique.indexOf(c) < 0) unique.push(c);\n  });\n  return unique.join(' ');\n}\n\nexport { isObject, extend, needsNavigation, needsPagination, needsScrollbar, uniqueClasses };","import { getWindow } from 'ssr-window';\nexport default function Resize({\n  swiper,\n  on,\n  emit\n}) {\n  const window = getWindow();\n  let observer = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      const {\n        width,\n        height\n      } = swiper;\n      let newWidth = width;\n      let newHeight = height;\n      entries.forEach(({\n        contentBoxSize,\n        contentRect,\n        target\n      }) => {\n        if (target && target !== swiper.el) return;\n        newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n        newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n      });\n\n      if (newWidth !== width || newHeight !== height) {\n        resizeHandler();\n      }\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}","import { getWindow } from 'ssr-window';\nexport default function Observer({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const observers = [];\n  const window = getWindow();\n\n  const attach = (target, options = {}) => {\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: typeof options.childList === 'undefined' ? true : options.childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n\n  const init = () => {\n    if (!swiper.params.observer) return;\n\n    if (swiper.params.observeParents) {\n      const containerParents = swiper.$el.parents();\n\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    } // Observe container\n\n\n    attach(swiper.$el[0], {\n      childList: swiper.params.observeSlideChildren\n    }); // Observe wrapper\n\n    attach(swiper.$wrapperEl[0], {\n      attributes: false\n    });\n  };\n\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}","/* underscore in name -> watch for changes */\nconst paramsList = ['modules', 'init', '_direction', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_preloadImages', 'updateOnImagesReady', '_loop', '_loopAdditionalSlides', '_loopedSlides', '_loopFillGroupWithBlank', 'loopPreventsSlide', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideBlankClass', 'slideActiveClass', 'slideDuplicateActiveClass', 'slideVisibleClass', 'slideDuplicateClass', 'slideNextClass', 'slideDuplicateNextClass', 'slidePrevClass', 'slideDuplicatePrevClass', 'wrapperClass', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren', // modules\n'a11y', 'autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'lazy', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', '_virtual', 'zoom'];\nexport { paramsList };","import { isObject, extend } from './utils.js';\n\nfunction updateSwiper({\n  swiper,\n  passedParams,\n  changedParams,\n  nextEl,\n  prevEl,\n  scrollbarEl,\n  paginationEl\n}) {\n  const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction');\n  const {\n    params: currentParams,\n    pagination,\n    navigation,\n    scrollbar,\n    thumbs\n  } = swiper;\n  let needThumbsInit;\n  let needControllerInit;\n  let needPaginationInit;\n  let needScrollbarInit;\n  let needNavigationInit;\n\n  if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {\n    needThumbsInit = true;\n  }\n\n  if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {\n    needControllerInit = true;\n  }\n\n  if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {\n    needPaginationInit = true;\n  }\n\n  if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {\n    needScrollbarInit = true;\n  }\n\n  if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {\n    needNavigationInit = true;\n  }\n\n  if (changedParams.includes('virtual')) {\n    if (passedParams.virtual && passedParams.virtual.slides && swiper.virtual) {\n      swiper.virtual.slides = passedParams.virtual.slides;\n      swiper.virtual.update();\n    }\n  }\n\n  const destroyModule = mod => {\n    if (!swiper[mod]) return;\n    swiper[mod].destroy();\n\n    if (mod === 'navigation') {\n      currentParams[mod].prevEl = undefined;\n      currentParams[mod].nextEl = undefined;\n      swiper[mod].prevEl = undefined;\n      swiper[mod].nextEl = undefined;\n    } else {\n      currentParams[mod].el = undefined;\n      swiper[mod].el = undefined;\n    }\n  };\n\n  updateParams.forEach(key => {\n    if (isObject(currentParams[key]) && isObject(passedParams[key])) {\n      extend(currentParams[key], passedParams[key]);\n    } else {\n      const newValue = passedParams[key];\n\n      if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) {\n        if (newValue === false) {\n          destroyModule(key);\n        }\n      } else {\n        currentParams[key] = passedParams[key];\n      }\n    }\n  });\n\n  if (needThumbsInit) {\n    const initialized = thumbs.init();\n\n    if (initialized) {\n      thumbs.update(true);\n    }\n  }\n\n  if (needControllerInit) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n\n  if (needPaginationInit) {\n    if (paginationEl) currentParams.pagination.el = paginationEl;\n    pagination.init();\n    pagination.render();\n    pagination.update();\n  }\n\n  if (needScrollbarInit) {\n    if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;\n    scrollbar.init();\n    scrollbar.updateSize();\n    scrollbar.setTranslate();\n  }\n\n  if (needNavigationInit) {\n    if (nextEl) currentParams.navigation.nextEl = nextEl;\n    if (prevEl) currentParams.navigation.prevEl = prevEl;\n    navigation.init();\n    navigation.update();\n  }\n\n  if (changedParams.includes('allowSlideNext')) {\n    swiper.allowSlideNext = passedParams.allowSlideNext;\n  }\n\n  if (changedParams.includes('allowSlidePrev')) {\n    swiper.allowSlidePrev = passedParams.allowSlidePrev;\n  }\n\n  if (changedParams.includes('direction')) {\n    swiper.changeDirection(passedParams.direction, false);\n  }\n\n  swiper.update();\n}\n\nexport { updateSwiper };","<script>\n  import {\n    onMount,\n    onDestroy,\n    afterUpdate,\n    createEventDispatcher,\n    tick,\n    beforeUpdate,\n  } from 'svelte';\n  import { getParams } from './get-params.js';\n  import { initSwiper, mountSwiper } from './init-swiper.js';\n  import {\n    needsScrollbar,\n    needsNavigation,\n    needsPagination,\n    uniqueClasses,\n    extend,\n  } from './utils.js';\n  import { getChangedParams } from './get-changed-params.js';\n  import { updateSwiper } from './update-swiper.js';\n\n  const dispatch = createEventDispatcher();\n\n  let className = undefined;\n  export { className as class };\n\n  let containerClasses = 'swiper';\n  let breakpointChanged = false;\n  let swiperInstance = null;\n  let oldPassedParams = null;\n\n  let paramsData;\n  let swiperParams;\n  let passedParams;\n  let restProps;\n\n  let swiperEl = null;\n  let prevEl = null;\n  let nextEl = null;\n  let scrollbarEl = null;\n  let paginationEl = null;\n  let virtualData = { slides: [] };\n\n  export function swiper() {\n    return swiperInstance;\n  }\n\n  const setVirtualData = (data) => {\n    virtualData = data;\n\n    tick().then(() => {\n      swiperInstance.$wrapperEl.children('.swiper-slide').each((el) => {\n        if (el.onSwiper) el.onSwiper(swiperInstance);\n      });\n      swiperInstance.updateSlides();\n      swiperInstance.updateProgress();\n      swiperInstance.updateSlidesClasses();\n      if (swiperInstance.lazy && swiperInstance.params.lazy.enabled) {\n        swiperInstance.lazy.load();\n      }\n    });\n  };\n\n  const calcParams = () => {\n    paramsData = getParams($$restProps);\n    swiperParams = paramsData.params;\n    passedParams = paramsData.passedParams;\n    restProps = paramsData.rest;\n  };\n\n  calcParams();\n  oldPassedParams = passedParams;\n\n  const onBeforeBreakpoint = () => {\n    breakpointChanged = true;\n  };\n\n  swiperParams.onAny = (event, ...args) => {\n    dispatch(event, [args]);\n  };\n  Object.assign(swiperParams.on, {\n    _beforeBreakpoint: onBeforeBreakpoint,\n    _containerClasses(_swiper, classes) {\n      containerClasses = classes;\n    },\n  });\n\n  swiperInstance = initSwiper(swiperParams);\n  if (swiperInstance.virtual && swiperInstance.params.virtual.enabled) {\n    const extendWith = {\n      cache: false,\n      renderExternal: (data) => {\n        setVirtualData(data);\n        if (swiperParams.virtual && swiperParams.virtual.renderExternal) {\n          swiperParams.virtual.renderExternal(data);\n        }\n      },\n      renderExternalUpdate: false,\n    };\n    extend(swiperInstance.params.virtual, extendWith);\n    extend(swiperInstance.originalParams.virtual, extendWith);\n  }\n\n  onMount(() => {\n    if (!swiperEl) return;\n    mountSwiper(\n      {\n        el: swiperEl,\n        nextEl: nextEl,\n        prevEl: prevEl,\n        paginationEl: paginationEl,\n        scrollbarEl: scrollbarEl,\n        swiper: swiperInstance,\n      },\n      swiperParams,\n    );\n    dispatch('swiper', [swiperInstance]);\n    if (swiperParams.virtual) return;\n    swiperInstance.slides.each((el) => {\n      if (el.onSwiper) el.onSwiper(swiperInstance);\n    });\n  });\n\n  afterUpdate(() => {\n    if (!swiperInstance) return;\n    calcParams();\n\n    const changedParams = getChangedParams(passedParams, oldPassedParams);\n    if (\n      (changedParams.length || breakpointChanged) &&\n      swiperInstance &&\n      !swiperInstance.destroyed\n    ) {\n      updateSwiper({\n        swiper: swiperInstance,\n        passedParams,\n        changedParams,\n        nextEl,\n        prevEl,\n        scrollbarEl,\n        paginationEl,\n      });\n    }\n    breakpointChanged = false;\n    oldPassedParams = passedParams;\n  });\n\n  onDestroy(() => {\n    // eslint-disable-next-line\n    if (typeof window !== 'undefined' && swiperInstance && !swiperInstance.destroyed) {\n      swiperInstance.destroy(true, false);\n    }\n  });\n</script>\n\n<div\n  bind:this={swiperEl}\n  class={uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)}\n  {...restProps}\n>\n  <slot name=\"container-start\" />\n  {#if needsNavigation(swiperParams)}\n    <div bind:this={prevEl} class=\"swiper-button-prev\" />\n    <div bind:this={nextEl} class=\"swiper-button-next\" />\n  {/if}\n  {#if needsScrollbar(swiperParams)}\n    <div bind:this={scrollbarEl} class=\"swiper-scrollbar\" />\n  {/if}\n  {#if needsPagination(swiperParams)}\n    <div bind:this={paginationEl} class=\"swiper-pagination\" />\n  {/if}\n  <div class=\"swiper-wrapper\">\n    <slot name=\"wrapper-start\" />\n    <slot {virtualData} />\n    <slot name=\"wrapper-end\" />\n  </div>\n  <slot name=\"container-end\" />\n</div>\n","import Swiper from 'swiper';\nimport { isObject, extend } from './utils.js';\nimport { paramsList } from './params-list.js';\n\nfunction getParams(obj = {}) {\n  const params = {\n    on: {}\n  };\n  const passedParams = {};\n  extend(params, Swiper.defaults);\n  extend(params, Swiper.extendedDefaults);\n  params._emitClasses = true;\n  params.init = false;\n  const rest = {};\n  const allowedParams = paramsList.map(key => key.replace(/_/, ''));\n  Object.keys(obj).forEach(key => {\n    if (allowedParams.indexOf(key) >= 0) {\n      if (isObject(obj[key])) {\n        params[key] = {};\n        passedParams[key] = {};\n        extend(params[key], obj[key]);\n        extend(passedParams[key], obj[key]);\n      } else {\n        params[key] = obj[key];\n        passedParams[key] = obj[key];\n      }\n    } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {\n      params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n    } else {\n      rest[key] = obj[key];\n    }\n  });\n  ['navigation', 'pagination', 'scrollbar'].forEach(key => {\n    if (params[key] === true) params[key] = {};\n    if (params[key] === false) delete params[key];\n  });\n  return {\n    params,\n    passedParams,\n    rest\n  };\n}\n\nexport { getParams };","import Swiper from 'swiper';\nimport { needsNavigation, needsPagination, needsScrollbar } from './utils.js';\n\nfunction initSwiper(swiperParams) {\n  return new Swiper(swiperParams);\n}\n\nfunction mountSwiper({\n  el,\n  nextEl,\n  prevEl,\n  paginationEl,\n  scrollbarEl,\n  swiper\n}, swiperParams) {\n  if (needsNavigation(swiperParams) && nextEl && prevEl) {\n    swiper.params.navigation.nextEl = nextEl;\n    swiper.originalParams.navigation.nextEl = nextEl;\n    swiper.params.navigation.prevEl = prevEl;\n    swiper.originalParams.navigation.prevEl = prevEl;\n  }\n\n  if (needsPagination(swiperParams) && paginationEl) {\n    swiper.params.pagination.el = paginationEl;\n    swiper.originalParams.pagination.el = paginationEl;\n  }\n\n  if (needsScrollbar(swiperParams) && scrollbarEl) {\n    swiper.params.scrollbar.el = scrollbarEl;\n    swiper.originalParams.scrollbar.el = scrollbarEl;\n  }\n\n  swiper.init(el);\n}\n\nexport { initSwiper, mountSwiper };","import { isObject } from './utils.js';\nimport { paramsList } from './params-list.js';\n\nfunction getChangedParams(swiperParams, oldParams) {\n  const keys = [];\n  if (!oldParams) return keys;\n\n  const addKey = key => {\n    if (keys.indexOf(key) < 0) keys.push(key);\n  };\n\n  const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, ''));\n  watchParams.forEach(key => {\n    if (key in swiperParams && key in oldParams) {\n      if (isObject(swiperParams[key]) && isObject(oldParams[key])) {\n        const newKeys = Object.keys(swiperParams[key]);\n        const oldKeys = Object.keys(oldParams[key]);\n\n        if (newKeys.length !== oldKeys.length) {\n          addKey(key);\n        } else {\n          newKeys.forEach(newKey => {\n            if (swiperParams[key][newKey] !== oldParams[key][newKey]) {\n              addKey(key);\n            }\n          });\n          oldKeys.forEach(oldKey => {\n            if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key);\n          });\n        }\n      } else if (swiperParams[key] !== oldParams[key]) {\n        addKey(key);\n      }\n    }\n  });\n  return keys;\n}\n\nexport { getChangedParams };","<script>\n  import { onMount, onDestroy, beforeUpdate, afterUpdate } from 'svelte';\n  import { uniqueClasses } from './utils.js';\n\n  export let zoom = undefined;\n  export let virtualIndex = undefined;\n\n  let className = undefined;\n  export { className as class };\n\n  let slideEl = null;\n  let slideClasses = 'swiper-slide';\n\n  let swiper = null;\n  let eventAttached = false;\n\n  const updateClasses = (_, el, classNames) => {\n    if (el === slideEl) {\n      slideClasses = classNames;\n    }\n  };\n\n  const attachEvent = () => {\n    if (!swiper || eventAttached) return;\n    swiper.on('_slideClass', updateClasses);\n    eventAttached = true;\n  };\n\n  const detachEvent = () => {\n    if (!swiper) return;\n    swiper.off('_slideClass', updateClasses);\n    eventAttached = false;\n  };\n\n  $: slideData = {\n    isActive:\n      slideClasses.indexOf('swiper-slide-active') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-active') >= 0,\n    isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0,\n    isDuplicate: slideClasses.indexOf('swiper-slide-duplicate') >= 0,\n    isPrev:\n      slideClasses.indexOf('swiper-slide-prev') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-prev') >= 0,\n    isNext:\n      slideClasses.indexOf('swiper-slide-next') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-next') >= 0,\n  };\n\n  onMount(() => {\n    if (typeof virtualIndex === 'undefined') return;\n    slideEl.onSwiper = (_swiper) => {\n      swiper = _swiper;\n      attachEvent();\n    };\n    attachEvent();\n  });\n\n  afterUpdate(() => {\n    if (!slideEl || !swiper) return;\n    if (swiper.destroyed) {\n      if (slideClasses !== 'swiper-slide') {\n        slideClasses = 'swiper-slide';\n      }\n      return;\n    }\n    attachEvent();\n  });\n\n  beforeUpdate(() => {\n    attachEvent();\n  });\n\n  onDestroy(() => {\n    if (!swiper) return;\n    detachEvent();\n  });\n</script>\n\n<div\n  bind:this={slideEl}\n  class={uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`)}\n  data-swiper-slide-index={virtualIndex}\n  {...$$restProps}\n>\n  {#if zoom}\n    <div\n      class=\"swiper-zoom-container\"\n      data-swiper-zoom={typeof zoom === 'number' ? zoom : undefined}\n    >\n      <slot data={slideData} />\n    </div>\n  {:else}\n    <slot data={slideData} />\n  {/if}\n</div>\n","export function searchFilter(player, searchString){\n    return player.name.toLowerCase().includes(searchString.toLowerCase());\n}\nexport function positionFilter(player, pos_filter){\n    return pos_filter === \"all\" || player.positions.includes(pos_filter);\n}\nexport function getTeams(games) {\n    let teams = [];\n    //iterate through games and add teams\n    for(let i = 0; i < games.length; i++) {\n        let game = games[i];\n        let home_team = game.home_team;\n        let away_team = game.away_team;\n        if(!teams.includes(home_team)) {\n            teams.push(home_team);\n        }\n        if(!teams.includes(away_team)) {\n            teams.push(away_team);\n        }\n    }\n    //sort teams by property short_name\n    teams.sort(function(a, b) {\n        return a.short_name.localeCompare(b.short_name);\n    });\n    return teams;\n}\nexport function filterByTeam(playerTeam, selectedTeam){\n    if(playerTeam == selectedTeam || selectedTeam == \"all\") {\n        return true;\n    } else {\n        return false;\n    }\n}\nexport function gameStrings(games) {\n    let gameStrings = {};\n    for(let i = 0; i < games.length; i++) {\n        let game = games[i];\n        gameStrings[game.away_team.short_name] = `<b>${game.away_team.short_name}</b> @ ${game.home_team.short_name}`;\n        gameStrings[game.home_team.short_name] = `${game.away_team.short_name} @ <b>${game.home_team.short_name}</b>`;\n    }\n    return gameStrings;\n}","<script>\n    export let home_team;\n    export let away_team;\n    export let game_time;\n    // Best price per market from fantasy/game_lines.card_lines:\n    // {away: {spread, total, ml}, home: {...}, books} with each cell {text, odds, book, link} or null\n    export let lines = null;\n    game_time = new Date(game_time);\n    const rows = () => [[\"away\", away_team], [\"home\", home_team]];\n    function cellOf(side, kind) {\n        return lines && lines[side] ? lines[side][kind] : null;\n    }\n</script>\n<style>\n    .team-row { display: grid; grid-template-columns: minmax(0, 1fr) repeat(3, 3.6rem); align-items: center; gap: .25rem; }\n    .team-row.no-lines { grid-template-columns: 1fr; }\n    .team-name { display: flex; align-items: center; min-width: 0; }\n    .team-name img { width: 2.2rem; height: 2.2rem; object-fit: contain; aspect-ratio: 1/1; }\n    .team-name .nm { font-size: 1.25rem; font-weight: 500; margin-left: .25rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .odds-cell { display: flex; flex-direction: column; justify-content: center; min-height: 2.35rem; border: 1px solid #dee2e6; border-radius: .35rem; padding: .15rem .1rem; line-height: 1.15; text-align: center; text-decoration: none; color: #212529; background: #fff; font-size: .72rem; }\n    .odds-cell:hover { border-color: #0d6efd; color: #0d6efd; background: #f3f7ff; }\n    .odds-cell .pt { font-weight: 600; white-space: nowrap; }\n    .odds-cell .px { color: #146c43; font-family: var(--bs-font-monospace); white-space: nowrap; }\n    .odds-cell.empty { color: #adb5bd; border-style: dashed; }\n    .hdr { display: grid; grid-template-columns: minmax(0, 1fr) repeat(3, 3.6rem); gap: .25rem; font-size: .6rem; text-transform: uppercase; letter-spacing: .04em; color: #6c757d; margin-bottom: .1rem; }\n    .hdr span { text-align: center; }\n    .foot { font-size: .62rem; color: #6c757d; margin-top: .2rem; text-align: right; }\n    .shop-link { color: #0d6efd; text-decoration: none; font-weight: 600; }\n    .shop-link:hover { text-decoration: underline; }\n</style>\n<div class=\"card mb-4 p-2 text-start\">\n    {#if lines}\n    <div class=\"hdr\"><span></span><span>Spread</span><span>Total</span><span>ML</span></div>\n    {/if}\n    {#each rows() as [side, team]}\n    <div class=\"team-row {lines ? '' : 'no-lines'} mb-1\">\n        <div class=\"team-name\">\n            <img loading=\"lazy\" src=\"{team.logo}\" alt=\"{team.short_name} logo\">\n            <span class=\"nm\">{team.short_name}</span>\n        </div>\n        {#if lines}\n        {#each [\"spread\", \"total\", \"ml\"] as kind}\n            {#if cellOf(side, kind)}\n                {#if cellOf(side, kind).link}\n                <a class=\"odds-cell\" href={cellOf(side, kind).link} target=\"_blank\" rel=\"nofollow noopener\" title=\"Bet at {cellOf(side, kind).book}\">\n                    {#if kind !== \"ml\"}<div class=\"pt\">{cellOf(side, kind).text}</div>{/if}\n                    <div class=\"px\">{cellOf(side, kind).odds}</div>\n                </a>\n                {:else}\n                <span class=\"odds-cell\" title=\"{cellOf(side, kind).book}\">\n                    {#if kind !== \"ml\"}<div class=\"pt\">{cellOf(side, kind).text}</div>{/if}\n                    <div class=\"px\">{cellOf(side, kind).odds}</div>\n                </span>\n                {/if}\n            {:else}\n                <span class=\"odds-cell empty\">&ndash;</span>\n            {/if}\n        {/each}\n        {/if}\n    </div>\n    {/each}\n    {#if lines}\n    <div class=\"foot\">Best of {lines.books} books &middot; tap to bet{#if lines.url} &middot; <a href={lines.url} class=\"shop-link\">Shop this game &rarr;</a>{/if}</div>\n    {/if}\n</div>\n","<script>\n    export let lineup_details;\n</script>\n<div id=\"lineup-holder\" class=\"card border shadow\" style=\"border-radius: 10px;\">\n    <div class=\"d-flex h4 bold text-center border-bottom py-2\">\n        <div id=\"salary-summary\" class=\"px-3\">\n            <div>Salary</div>\n            <div>${lineup_details.salary}</div>\n        </div>\n        <div id=\"fp-summary\" class=\"px-3\">\n            <div>Projection</div>\n            <div>{lineup_details.fantasy_points} FP</div>\n        </div>\n        {#if lineup_details.entry_id}\n            <div class=\"px-3 fs-6\">\n                <div>Entry</div>\n                <div>{lineup_details.entry_id}{#if lineup_details.changed === false} <span class=\"badge bg-secondary\">unchanged</span>{/if}</div>\n            </div>\n        {/if}\n    </div>\n    <div class=\"d-flex flex-column\">\n        {#each Object.entries(lineup_details.lineup) as [pos, player]}\n        {#if player}\n            <div class=\"hidden-border roster-slot d-flex border-bottom align-items-center\">\n                <div class=\"display-5 col-4\"><img alt=\"{player.name}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\" height=\"70\" src=\"{player.img_thumb}\"></div>\n                <div class=\"col-8 h6 my-0 d-flex align-items-center\">\n                    <div class=\"d-flex flex-column\">\n                        <div>{player.name}\n                            {#if player.inj_tag == \"O\"}\n                            <span class=\"badge bg-danger\">OUT</span>\n                            {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                            <span class=\"badge bg-warning\">{player.inj_tag}</span>\n                            {/if}\n                            {#if player.locked}\n                            <span class=\"badge bg-secondary\" title=\"Game started: kept in place\">🔒</span>\n                            {/if}\n                        </div>\n                        <div><span class=\"text-success\">💸{player.salary.toLocaleString()}</span> | <span class=\"text-primary\">{player.proj}</span></div>\n                    </div>\n                </div>\n            </div>\n        {/if}\n        {/each}\n    </div>\n</div>","<script>\n    export let index;\n    export let player_name;\n    export let player_image;\n    export let positions;\n    export let salary;\n    export let projection;\n    export let included;\n    export let rosterPlayer;\n    export let excludePlayer;\n    export let includePlayer;\n    export let rosterable = \"\";\n    export let inj_tag = \"H\";\n    export let game_details;\n    export let player;\n    export let showPlayerModal;\n</script>\n<style>\n    .unrosterable{\n        opacity: 0.5;\n    }\n</style>\n<div class=\"{rosterable} row border-top border-start border-end\">\n    <div class=\"col-9\">\n        <div class=\"row\">\n            <div class=\"col-4 pt-1 mt-auto px-0 text-center\">\n                <img alt=\"{player_name}\" style=\"object-fit: contain;\" loading=\"lazy\" height=\"65\" width=\"89\" src=\"{player_image}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\">\n            </div>\n            <div class=\"col-8\">\n                <div class=\"d-flex flex-column\">\n                    <div style=\"cursor: pointer;\" on:click={()=>{showPlayerModal(player)}}>\n                        <span class=\"bg-light px-1 border\">{positions}</span> <span class=\"text-primary fw-normal\">{player_name}</span>\n                    </div>\n                </div>\n                <div>\n                    <span class=\"text-success\">💸{salary.toLocaleString()}</span> | \n                    <span class=\"text-primary\">📊{projection}</span>\n                    <span>\n                        {#if inj_tag == \"O\"}\n                        <span class=\"badge bg-danger\">OUT</span>\n                        {:else if inj_tag == \"Q\" || inj_tag == \"D\" || inj_tag == \"GTD\"}\n                        <span class=\"badge bg-warning\">{inj_tag}</span>\n                        {/if}\n                    </span>\n                </div>\n                <div>\n                    <span class=\"text-secondary\">{@html game_details}</span>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div class=\"col-3 p-0 pe-1 my-auto ms-auto\">\n        <div>\n            <div class=\"flex-wrap btn-group w-100 shadow\" role=\"group\" aria-label=\"Basic example\">\n                {#if included}\n                <button on:click={()=>rosterPlayer(index)} type=\"button\" class=\"btn btn-primary\">🔒</button>\n                <button on:click={()=>excludePlayer(index)} type=\"button\" class=\"btn btn-danger\">✖️</button>\n                {:else}\n                <button on:click={()=>includePlayer(index)} type=\"button\" class=\"btn btn-success\">✔️</button>\n                {/if}\n            </div>\n        </div>\n    </div>\n</div>","/** \n * Box-Muller implementation\n * https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform\n */\n\n(function(exports){\n  const PRECISION = 1e9;\n  const _2PI = Math.PI * 2;\n  function generateGaussian(mean,std){\n    var u1 = Math.random();\n    var u2 = Math.random();\n    \n    var z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(_2PI * u2);\n    var z1 = Math.sqrt(-2.0 * Math.log(u1)) * Math.sin(_2PI * u2);\n\n    return z0 * std + mean;\n  }\n\n  exports(generateGaussian)\n})\n(typeof(exports) !== \"undefined\"\n    ? function(e) { module.exports = e; }\n    : function(e) { this[\"boxmuller\"] = e; });\n  \n","(function(exports) {\n\n  const generateGaussian = require('./box-muller');\n\n  // Complementary error function\n  // From Numerical Recipes in C 2e p221\n  var erfc = function(x) {\n    var z = Math.abs(x);\n    var t = 1 / (1 + z / 2);\n    var r = t * Math.exp(-z * z - 1.26551223 + t * (1.00002368 +\n            t * (0.37409196 + t * (0.09678418 + t * (-0.18628806 +\n            t * (0.27886807 + t * (-1.13520398 + t * (1.48851587 +\n            t * (-0.82215223 + t * 0.17087277)))))))))\n    return x >= 0 ? r : 2 - r;\n  };\n\n  // Inverse complementary error function\n  // From Numerical Recipes 3e p265\n  var ierfc = function(x) {\n    if (x >= 2) { return -100; }\n    if (x <= 0) { return 100; }\n\n    var xx = (x < 1) ? x : 2 - x;\n    var t = Math.sqrt(-2 * Math.log(xx / 2));\n\n    var r = -0.70711 * ((2.30753 + t * 0.27061) /\n            (1 + t * (0.99229 + t * 0.04481)) - t);\n\n    for (var j = 0; j < 2; j++) {\n      var err = erfc(r) - xx;\n      r += err / (1.12837916709551257 * Math.exp(-(r * r)) - r * err);\n    }\n\n    return (x < 1) ? r : -r;\n  };\n\n  // Models the normal distribution\n  var Gaussian = function(mean, variance) {\n    if (variance <= 0) {\n      throw new Error('Variance must be > 0 (but was ' + variance + ')');\n    }\n    this.mean = mean;\n    this.variance = variance;\n    this.standardDeviation = Math.sqrt(variance);\n  }\n\n  // Probability density function\n  Gaussian.prototype.pdf = function(x) {\n    var m = this.standardDeviation * Math.sqrt(2 * Math.PI);\n    var e = Math.exp(-Math.pow(x - this.mean, 2) / (2 * this.variance));\n    return e / m;\n  };\n\n  // Cumulative density function\n  Gaussian.prototype.cdf = function(x) {\n    return 0.5 * erfc(-(x - this.mean) / (this.standardDeviation * Math.sqrt(2)));\n  };\n\n  // Percent point function\n  Gaussian.prototype.ppf = function(x) {\n    return this.mean - this.standardDeviation * Math.sqrt(2) * ierfc(2 * x);\n  };\n\n  // Product distribution of this and d (scale for constant)\n  Gaussian.prototype.mul = function(d) {\n    if (typeof(d) === \"number\") {\n      return this.scale(d);\n    }\n    var precision = 1 / this.variance;\n    var dprecision = 1 / d.variance;\n    return fromPrecisionMean(\n        precision + dprecision, \n        precision * this.mean + dprecision * d.mean);\n  };\n\n  // Quotient distribution of this and d (scale for constant)\n  Gaussian.prototype.div = function(d) {\n    if (typeof(d) === \"number\") {\n      return this.scale(1 / d);\n    }\n    var precision = 1 / this.variance;\n    var dprecision = 1 / d.variance;\n    return fromPrecisionMean(\n        precision - dprecision, \n        precision * this.mean - dprecision * d.mean);\n  };\n\n  // Addition of this and d\n  Gaussian.prototype.add = function(d) {\n    return gaussian(this.mean + d.mean, this.variance + d.variance);\n  };\n\n  // Subtraction of this and d\n  Gaussian.prototype.sub = function(d) {\n    return gaussian(this.mean - d.mean, this.variance + d.variance);\n  };\n\n  // Scale this by constant c\n  Gaussian.prototype.scale = function(c) {\n    return gaussian(this.mean * c, this.variance * c * c);\n  };\n\n  // Generate [num] random samples\n  Gaussian.prototype.random = function(num){\n    let mean = this.mean;\n    let std = this.standardDeviation;\n    return Array(num).fill(0).map(() => {\n      return generateGaussian(mean,std)\n    })\n  };\n\n  var gaussian = function(mean, variance) {\n    return new Gaussian(mean, variance);\n  };\n\n  var fromPrecisionMean = function(precision, precisionmean) {\n    return gaussian(precisionmean / precision, 1 / precision);\n  };\n\n  exports(gaussian);\n})\n(typeof(exports) !== \"undefined\"\n    ? function(e) { module.exports = e; }\n    : function(e) { this[\"gaussian\"] = e; });\n","/*!\n * Chart.js v3.7.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n  return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n  if (typeof window === 'undefined') {\n    return function(callback) {\n      return callback();\n    };\n  }\n  return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n  const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n  let ticking = false;\n  let args = [];\n  return function(...rest) {\n    args = updateArgs(rest);\n    if (!ticking) {\n      ticking = true;\n      requestAnimFrame.call(window, () => {\n        ticking = false;\n        fn.apply(thisArg, args);\n      });\n    }\n  };\n}\nfunction debounce(fn, delay) {\n  let timeout;\n  return function(...args) {\n    if (delay) {\n      clearTimeout(timeout);\n      timeout = setTimeout(fn, delay, args);\n    } else {\n      fn.apply(this, args);\n    }\n    return delay;\n  };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n  const check = rtl ? 'left' : 'right';\n  return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\nfunction noop() {}\nconst uid = (function() {\n  let id = 0;\n  return function() {\n    return id++;\n  };\n}());\nfunction isNullOrUndef(value) {\n  return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n  if (Array.isArray && Array.isArray(value)) {\n    return true;\n  }\n  const type = Object.prototype.toString.call(value);\n  if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n    return true;\n  }\n  return false;\n}\nfunction isObject(value) {\n  return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n  return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n  return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100\n    : value / dimension;\nconst toDimension = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100 * dimension\n    : +value;\nfunction callback(fn, args, thisArg) {\n  if (fn && typeof fn.call === 'function') {\n    return fn.apply(thisArg, args);\n  }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n  let i, len, keys;\n  if (isArray(loopable)) {\n    len = loopable.length;\n    if (reverse) {\n      for (i = len - 1; i >= 0; i--) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    } else {\n      for (i = 0; i < len; i++) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    }\n  } else if (isObject(loopable)) {\n    keys = Object.keys(loopable);\n    len = keys.length;\n    for (i = 0; i < len; i++) {\n      fn.call(thisArg, loopable[keys[i]], keys[i]);\n    }\n  }\n}\nfunction _elementsEqual(a0, a1) {\n  let i, ilen, v0, v1;\n  if (!a0 || !a1 || a0.length !== a1.length) {\n    return false;\n  }\n  for (i = 0, ilen = a0.length; i < ilen; ++i) {\n    v0 = a0[i];\n    v1 = a1[i];\n    if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction clone$1(source) {\n  if (isArray(source)) {\n    return source.map(clone$1);\n  }\n  if (isObject(source)) {\n    const target = Object.create(null);\n    const keys = Object.keys(source);\n    const klen = keys.length;\n    let k = 0;\n    for (; k < klen; ++k) {\n      target[keys[k]] = clone$1(source[keys[k]]);\n    }\n    return target;\n  }\n  return source;\n}\nfunction isValidKey(key) {\n  return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    merge(tval, sval, options);\n  } else {\n    target[key] = clone$1(sval);\n  }\n}\nfunction merge(target, source, options) {\n  const sources = isArray(source) ? source : [source];\n  const ilen = sources.length;\n  if (!isObject(target)) {\n    return target;\n  }\n  options = options || {};\n  const merger = options.merger || _merger;\n  for (let i = 0; i < ilen; ++i) {\n    source = sources[i];\n    if (!isObject(source)) {\n      continue;\n    }\n    const keys = Object.keys(source);\n    for (let k = 0, klen = keys.length; k < klen; ++k) {\n      merger(keys[k], target, source, options);\n    }\n  }\n  return target;\n}\nfunction mergeIf(target, source) {\n  return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    mergeIf(tval, sval);\n  } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n    target[key] = clone$1(sval);\n  }\n}\nfunction _deprecated(scope, value, previous, current) {\n  if (value !== undefined) {\n    console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n  }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n  const idx = key.indexOf(dot, start);\n  return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n  if (key === emptyString) {\n    return obj;\n  }\n  let pos = 0;\n  let idx = indexOfDotOrLength(key, pos);\n  while (obj && idx > pos) {\n    obj = obj[key.substr(pos, idx - pos)];\n    pos = idx + 1;\n    idx = indexOfDotOrLength(key, pos);\n  }\n  return obj;\n}\nfunction _capitalize(str) {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const item of a) {\n    if (!b.has(item)) {\n      return false;\n    }\n  }\n  return true;\n};\nfunction _isClickEvent(e) {\n  return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n  const roundedRange = Math.round(range);\n  range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n  const niceRange = Math.pow(10, Math.floor(log10(range)));\n  const fraction = range / niceRange;\n  const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n  return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n  const result = [];\n  const sqrt = Math.sqrt(value);\n  let i;\n  for (i = 1; i < sqrt; i++) {\n    if (value % i === 0) {\n      result.push(i);\n      result.push(value / i);\n    }\n  }\n  if (sqrt === (sqrt | 0)) {\n    result.push(sqrt);\n  }\n  result.sort((a, b) => a - b).pop();\n  return result;\n}\nfunction isNumber(n) {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n  return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n  const rounded = Math.round(x);\n  return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n  let i, ilen, value;\n  for (i = 0, ilen = array.length; i < ilen; i++) {\n    value = array[i][property];\n    if (!isNaN(value)) {\n      target.min = Math.min(target.min, value);\n      target.max = Math.max(target.max, value);\n    }\n  }\n}\nfunction toRadians(degrees) {\n  return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n  return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n  if (!isNumberFinite(x)) {\n    return;\n  }\n  let e = 1;\n  let p = 0;\n  while (Math.round(x * e) / e !== x) {\n    e *= 10;\n    p++;\n  }\n  return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n  const distanceFromXCenter = anglePoint.x - centrePoint.x;\n  const distanceFromYCenter = anglePoint.y - centrePoint.y;\n  const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n  let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n  if (angle < (-0.5 * PI)) {\n    angle += TAU;\n  }\n  return {\n    angle,\n    distance: radialDistanceFromCenter\n  };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n  return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n  return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n  return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n  const a = _normalizeAngle(angle);\n  const s = _normalizeAngle(start);\n  const e = _normalizeAngle(end);\n  const angleToStart = _normalizeAngle(s - a);\n  const angleToEnd = _normalizeAngle(e - a);\n  const startToAngle = _normalizeAngle(a - s);\n  const endToAngle = _normalizeAngle(a - e);\n  return a === s || a === e || (sameAngleIsFullCircle && s === e)\n    || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n  return _limitValue(value, -32768, 32767);\n}\nfunction _isBetween(value, start, end, epsilon = 1e-6) {\n  return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n  linear: t => t,\n  easeInQuad: t => t * t,\n  easeOutQuad: t => -t * (t - 2),\n  easeInOutQuad: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t\n    : -0.5 * ((--t) * (t - 2) - 1),\n  easeInCubic: t => t * t * t,\n  easeOutCubic: t => (t -= 1) * t * t + 1,\n  easeInOutCubic: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t\n    : 0.5 * ((t -= 2) * t * t + 2),\n  easeInQuart: t => t * t * t * t,\n  easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n  easeInOutQuart: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t\n    : -0.5 * ((t -= 2) * t * t * t - 2),\n  easeInQuint: t => t * t * t * t * t,\n  easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n  easeInOutQuint: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t * t\n    : 0.5 * ((t -= 2) * t * t * t * t + 2),\n  easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n  easeOutSine: t => Math.sin(t * HALF_PI),\n  easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n  easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n  easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n  easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n    ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n    : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n  easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n  easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n  easeInOutCirc: t => ((t /= 0.5) < 1)\n    ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n    : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n  easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n  easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n  easeInOutElastic(t) {\n    const s = 0.1125;\n    const p = 0.45;\n    return atEdge(t) ? t :\n      t < 0.5\n        ? 0.5 * elasticIn(t * 2, s, p)\n        : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n  },\n  easeInBack(t) {\n    const s = 1.70158;\n    return t * t * ((s + 1) * t - s);\n  },\n  easeOutBack(t) {\n    const s = 1.70158;\n    return (t -= 1) * t * ((s + 1) * t + s) + 1;\n  },\n  easeInOutBack(t) {\n    let s = 1.70158;\n    if ((t /= 0.5) < 1) {\n      return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n    }\n    return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n  },\n  easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n  easeOutBounce(t) {\n    const m = 7.5625;\n    const d = 2.75;\n    if (t < (1 / d)) {\n      return m * t * t;\n    }\n    if (t < (2 / d)) {\n      return m * (t -= (1.5 / d)) * t + 0.75;\n    }\n    if (t < (2.5 / d)) {\n      return m * (t -= (2.25 / d)) * t + 0.9375;\n    }\n    return m * (t -= (2.625 / d)) * t + 0.984375;\n  },\n  easeInOutBounce: t => (t < 0.5)\n    ? effects.easeInBounce(t * 2) * 0.5\n    : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map[str[1]] * 17,\n\t\t\t\tg: 255 & map[str[2]] * 17,\n\t\t\t\tb: 255 & map[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map[str[1]] << 4 | map[str[2]],\n\t\t\t\tg: map[str[3]] << 4 | map[str[4]],\n\t\t\t\tb: map[str[5]] << 4 | map[str[6]],\n\t\t\t\ta: len === 9 ? (map[str[7]] << 4 | map[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n  return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n  return isPatternOrGradient(value)\n    ? value\n    : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n  if (!key) {\n    return node;\n  }\n  const keys = key.split('.');\n  for (let i = 0, n = keys.length; i < n; ++i) {\n    const k = keys[i];\n    node = node[k] || (node[k] = Object.create(null));\n  }\n  return node;\n}\nfunction set(root, scope, values) {\n  if (typeof scope === 'string') {\n    return merge(getScope$1(root, scope), values);\n  }\n  return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n  constructor(_descriptors) {\n    this.animation = undefined;\n    this.backgroundColor = 'rgba(0,0,0,0.1)';\n    this.borderColor = 'rgba(0,0,0,0.1)';\n    this.color = '#666';\n    this.datasets = {};\n    this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n    this.elements = {};\n    this.events = [\n      'mousemove',\n      'mouseout',\n      'click',\n      'touchstart',\n      'touchmove'\n    ];\n    this.font = {\n      family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n      size: 12,\n      style: 'normal',\n      lineHeight: 1.2,\n      weight: null\n    };\n    this.hover = {};\n    this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n    this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n    this.hoverColor = (ctx, options) => getHoverColor(options.color);\n    this.indexAxis = 'x';\n    this.interaction = {\n      mode: 'nearest',\n      intersect: true\n    };\n    this.maintainAspectRatio = true;\n    this.onHover = null;\n    this.onClick = null;\n    this.parsing = true;\n    this.plugins = {};\n    this.responsive = true;\n    this.scale = undefined;\n    this.scales = {};\n    this.showLine = true;\n    this.drawActiveElementsOnTop = true;\n    this.describe(_descriptors);\n  }\n  set(scope, values) {\n    return set(this, scope, values);\n  }\n  get(scope) {\n    return getScope$1(this, scope);\n  }\n  describe(scope, values) {\n    return set(descriptors, scope, values);\n  }\n  override(scope, values) {\n    return set(overrides, scope, values);\n  }\n  route(scope, name, targetScope, targetName) {\n    const scopeObject = getScope$1(this, scope);\n    const targetScopeObject = getScope$1(this, targetScope);\n    const privateName = '_' + name;\n    Object.defineProperties(scopeObject, {\n      [privateName]: {\n        value: scopeObject[name],\n        writable: true\n      },\n      [name]: {\n        enumerable: true,\n        get() {\n          const local = this[privateName];\n          const target = targetScopeObject[targetName];\n          if (isObject(local)) {\n            return Object.assign({}, target, local);\n          }\n          return valueOrDefault(local, target);\n        },\n        set(value) {\n          this[privateName] = value;\n        }\n      }\n    });\n  }\n}\nvar defaults = new Defaults({\n  _scriptable: (name) => !name.startsWith('on'),\n  _indexable: (name) => name !== 'events',\n  hover: {\n    _fallback: 'interaction'\n  },\n  interaction: {\n    _scriptable: false,\n    _indexable: false,\n  }\n});\n\nfunction toFontString(font) {\n  if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n    return null;\n  }\n  return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n  let textWidth = data[string];\n  if (!textWidth) {\n    textWidth = data[string] = ctx.measureText(string).width;\n    gc.push(string);\n  }\n  if (textWidth > longest) {\n    longest = textWidth;\n  }\n  return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n  cache = cache || {};\n  let data = cache.data = cache.data || {};\n  let gc = cache.garbageCollect = cache.garbageCollect || [];\n  if (cache.font !== font) {\n    data = cache.data = {};\n    gc = cache.garbageCollect = [];\n    cache.font = font;\n  }\n  ctx.save();\n  ctx.font = font;\n  let longest = 0;\n  const ilen = arrayOfThings.length;\n  let i, j, jlen, thing, nestedThing;\n  for (i = 0; i < ilen; i++) {\n    thing = arrayOfThings[i];\n    if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n      longest = _measureText(ctx, data, gc, longest, thing);\n    } else if (isArray(thing)) {\n      for (j = 0, jlen = thing.length; j < jlen; j++) {\n        nestedThing = thing[j];\n        if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n          longest = _measureText(ctx, data, gc, longest, nestedThing);\n        }\n      }\n    }\n  }\n  ctx.restore();\n  const gcLen = gc.length / 2;\n  if (gcLen > arrayOfThings.length) {\n    for (i = 0; i < gcLen; i++) {\n      delete data[gc[i]];\n    }\n    gc.splice(0, gcLen);\n  }\n  return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n  const devicePixelRatio = chart.currentDevicePixelRatio;\n  const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n  return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n  ctx = ctx || canvas.getContext('2d');\n  ctx.save();\n  ctx.resetTransform();\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n  ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n  let type, xOffset, yOffset, size, cornerRadius;\n  const style = options.pointStyle;\n  const rotation = options.rotation;\n  const radius = options.radius;\n  let rad = (rotation || 0) * RAD_PER_DEG;\n  if (style && typeof style === 'object') {\n    type = style.toString();\n    if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(rad);\n      ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n      ctx.restore();\n      return;\n    }\n  }\n  if (isNaN(radius) || radius <= 0) {\n    return;\n  }\n  ctx.beginPath();\n  switch (style) {\n  default:\n    ctx.arc(x, y, radius, 0, TAU);\n    ctx.closePath();\n    break;\n  case 'triangle':\n    ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    ctx.closePath();\n    break;\n  case 'rectRounded':\n    cornerRadius = radius * 0.516;\n    size = radius - cornerRadius;\n    xOffset = Math.cos(rad + QUARTER_PI) * size;\n    yOffset = Math.sin(rad + QUARTER_PI) * size;\n    ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n    ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n    ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n    ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n    ctx.closePath();\n    break;\n  case 'rect':\n    if (!rotation) {\n      size = Math.SQRT1_2 * radius;\n      ctx.rect(x - size, y - size, 2 * size, 2 * size);\n      break;\n    }\n    rad += QUARTER_PI;\n  case 'rectRot':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    ctx.closePath();\n    break;\n  case 'crossRot':\n    rad += QUARTER_PI;\n  case 'cross':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'star':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    rad += QUARTER_PI;\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'line':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    break;\n  case 'dash':\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n    break;\n  }\n  ctx.fill();\n  if (options.borderWidth > 0) {\n    ctx.stroke();\n  }\n}\nfunction _isPointInArea(point, area, margin) {\n  margin = margin || 0.5;\n  return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\nfunction clipArea(ctx, area) {\n  ctx.save();\n  ctx.beginPath();\n  ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n  ctx.clip();\n}\nfunction unclipArea(ctx) {\n  ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  if (mode === 'middle') {\n    const midpoint = (previous.x + target.x) / 2.0;\n    ctx.lineTo(midpoint, previous.y);\n    ctx.lineTo(midpoint, target.y);\n  } else if (mode === 'after' !== !!flip) {\n    ctx.lineTo(previous.x, target.y);\n  } else {\n    ctx.lineTo(target.x, previous.y);\n  }\n  ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  ctx.bezierCurveTo(\n    flip ? previous.cp1x : previous.cp2x,\n    flip ? previous.cp1y : previous.cp2y,\n    flip ? target.cp2x : target.cp1x,\n    flip ? target.cp2y : target.cp1y,\n    target.x,\n    target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n  const lines = isArray(text) ? text : [text];\n  const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n  let i, line;\n  ctx.save();\n  ctx.font = font.string;\n  setRenderOpts(ctx, opts);\n  for (i = 0; i < lines.length; ++i) {\n    line = lines[i];\n    if (stroke) {\n      if (opts.strokeColor) {\n        ctx.strokeStyle = opts.strokeColor;\n      }\n      if (!isNullOrUndef(opts.strokeWidth)) {\n        ctx.lineWidth = opts.strokeWidth;\n      }\n      ctx.strokeText(line, x, y, opts.maxWidth);\n    }\n    ctx.fillText(line, x, y, opts.maxWidth);\n    decorateText(ctx, x, y, line, opts);\n    y += font.lineHeight;\n  }\n  ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n  if (opts.translation) {\n    ctx.translate(opts.translation[0], opts.translation[1]);\n  }\n  if (!isNullOrUndef(opts.rotation)) {\n    ctx.rotate(opts.rotation);\n  }\n  if (opts.color) {\n    ctx.fillStyle = opts.color;\n  }\n  if (opts.textAlign) {\n    ctx.textAlign = opts.textAlign;\n  }\n  if (opts.textBaseline) {\n    ctx.textBaseline = opts.textBaseline;\n  }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n  if (opts.strikethrough || opts.underline) {\n    const metrics = ctx.measureText(line);\n    const left = x - metrics.actualBoundingBoxLeft;\n    const right = x + metrics.actualBoundingBoxRight;\n    const top = y - metrics.actualBoundingBoxAscent;\n    const bottom = y + metrics.actualBoundingBoxDescent;\n    const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.beginPath();\n    ctx.lineWidth = opts.decorationWidth || 2;\n    ctx.moveTo(left, yDecoration);\n    ctx.lineTo(right, yDecoration);\n    ctx.stroke();\n  }\n}\nfunction addRoundedRectPath(ctx, rect) {\n  const {x, y, w, h, radius} = rect;\n  ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n  ctx.lineTo(x, y + h - radius.bottomLeft);\n  ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n  ctx.lineTo(x + w - radius.bottomRight, y + h);\n  ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n  ctx.lineTo(x + w, y + radius.topRight);\n  ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n  ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n  const matches = ('' + value).match(LINE_HEIGHT);\n  if (!matches || matches[1] === 'normal') {\n    return size * 1.2;\n  }\n  value = +matches[2];\n  switch (matches[3]) {\n  case 'px':\n    return value;\n  case '%':\n    value /= 100;\n    break;\n  }\n  return size * value;\n}\nconst numberOrZero = v => +v || 0;\nfunction _readValueToProps(value, props) {\n  const ret = {};\n  const objProps = isObject(props);\n  const keys = objProps ? Object.keys(props) : props;\n  const read = isObject(value)\n    ? objProps\n      ? prop => valueOrDefault(value[prop], value[props[prop]])\n      : prop => value[prop]\n    : () => value;\n  for (const prop of keys) {\n    ret[prop] = numberOrZero(read(prop));\n  }\n  return ret;\n}\nfunction toTRBL(value) {\n  return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n  return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n  const obj = toTRBL(value);\n  obj.width = obj.left + obj.right;\n  obj.height = obj.top + obj.bottom;\n  return obj;\n}\nfunction toFont(options, fallback) {\n  options = options || {};\n  fallback = fallback || defaults.font;\n  let size = valueOrDefault(options.size, fallback.size);\n  if (typeof size === 'string') {\n    size = parseInt(size, 10);\n  }\n  let style = valueOrDefault(options.style, fallback.style);\n  if (style && !('' + style).match(FONT_STYLE)) {\n    console.warn('Invalid font style specified: \"' + style + '\"');\n    style = '';\n  }\n  const font = {\n    family: valueOrDefault(options.family, fallback.family),\n    lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n    size,\n    style,\n    weight: valueOrDefault(options.weight, fallback.weight),\n    string: ''\n  };\n  font.string = toFontString(font);\n  return font;\n}\nfunction resolve(inputs, context, index, info) {\n  let cacheable = true;\n  let i, ilen, value;\n  for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n    value = inputs[i];\n    if (value === undefined) {\n      continue;\n    }\n    if (context !== undefined && typeof value === 'function') {\n      value = value(context);\n      cacheable = false;\n    }\n    if (index !== undefined && isArray(value)) {\n      value = value[index % value.length];\n      cacheable = false;\n    }\n    if (value !== undefined) {\n      if (info && !cacheable) {\n        info.cacheable = false;\n      }\n      return value;\n    }\n  }\n}\nfunction _addGrace(minmax, grace, beginAtZero) {\n  const {min, max} = minmax;\n  const change = toDimension(grace, (max - min) / 2);\n  const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add;\n  return {\n    min: keepZero(min, -Math.abs(change)),\n    max: keepZero(max, change)\n  };\n}\nfunction createContext(parentContext, context) {\n  return Object.assign(Object.create(parentContext), context);\n}\n\nfunction _lookup(table, value, cmp) {\n  cmp = cmp || ((index) => table[index] < value);\n  let hi = table.length - 1;\n  let lo = 0;\n  let mid;\n  while (hi - lo > 1) {\n    mid = (lo + hi) >> 1;\n    if (cmp(mid)) {\n      lo = mid;\n    } else {\n      hi = mid;\n    }\n  }\n  return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n  _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n  _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n  let start = 0;\n  let end = values.length;\n  while (start < end && values[start] < min) {\n    start++;\n  }\n  while (end > start && values[end - 1] > max) {\n    end--;\n  }\n  return start > 0 || end < values.length\n    ? values.slice(start, end)\n    : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n  if (array._chartjs) {\n    array._chartjs.listeners.push(listener);\n    return;\n  }\n  Object.defineProperty(array, '_chartjs', {\n    configurable: true,\n    enumerable: false,\n    value: {\n      listeners: [listener]\n    }\n  });\n  arrayEvents.forEach((key) => {\n    const method = '_onData' + _capitalize(key);\n    const base = array[key];\n    Object.defineProperty(array, key, {\n      configurable: true,\n      enumerable: false,\n      value(...args) {\n        const res = base.apply(this, args);\n        array._chartjs.listeners.forEach((object) => {\n          if (typeof object[method] === 'function') {\n            object[method](...args);\n          }\n        });\n        return res;\n      }\n    });\n  });\n}\nfunction unlistenArrayEvents(array, listener) {\n  const stub = array._chartjs;\n  if (!stub) {\n    return;\n  }\n  const listeners = stub.listeners;\n  const index = listeners.indexOf(listener);\n  if (index !== -1) {\n    listeners.splice(index, 1);\n  }\n  if (listeners.length > 0) {\n    return;\n  }\n  arrayEvents.forEach((key) => {\n    delete array[key];\n  });\n  delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n  const set = new Set();\n  let i, ilen;\n  for (i = 0, ilen = items.length; i < ilen; ++i) {\n    set.add(items[i]);\n  }\n  if (set.size === ilen) {\n    return items;\n  }\n  return Array.from(set);\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n  if (!defined(fallback)) {\n    fallback = _resolve('_fallback', scopes);\n  }\n  const cache = {\n    [Symbol.toStringTag]: 'Object',\n    _cacheable: true,\n    _scopes: scopes,\n    _rootScopes: rootScopes,\n    _fallback: fallback,\n    _getTarget: getTarget,\n    override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete target._keys;\n      delete scopes[0][prop];\n      return true;\n    },\n    get(target, prop) {\n      return _cached(target, prop,\n        () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(scopes[0]);\n    },\n    has(target, prop) {\n      return getKeysFromAllScopes(target).includes(prop);\n    },\n    ownKeys(target) {\n      return getKeysFromAllScopes(target);\n    },\n    set(target, prop, value) {\n      const storage = target._storage || (target._storage = getTarget());\n      target[prop] = storage[prop] = value;\n      delete target._keys;\n      return true;\n    }\n  });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n  const cache = {\n    _cacheable: false,\n    _proxy: proxy,\n    _context: context,\n    _subProxy: subProxy,\n    _stack: new Set(),\n    _descriptors: _descriptors(proxy, descriptorDefaults),\n    setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n    override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete proxy[prop];\n      return true;\n    },\n    get(target, prop, receiver) {\n      return _cached(target, prop,\n        () => _resolveWithContext(target, prop, receiver));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return target._descriptors.allKeys\n        ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n        : Reflect.getOwnPropertyDescriptor(proxy, prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(proxy);\n    },\n    has(target, prop) {\n      return Reflect.has(proxy, prop);\n    },\n    ownKeys() {\n      return Reflect.ownKeys(proxy);\n    },\n    set(target, prop, value) {\n      proxy[prop] = value;\n      delete target[prop];\n      return true;\n    }\n  });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n  return {\n    allKeys: _allKeys,\n    scriptable: _scriptable,\n    indexable: _indexable,\n    isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n    isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n  };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters' &&\n  (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n  if (Object.prototype.hasOwnProperty.call(target, prop)) {\n    return target[prop];\n  }\n  const value = resolve();\n  target[prop] = value;\n  return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  let value = _proxy[prop];\n  if (isFunction(value) && descriptors.isScriptable(prop)) {\n    value = _resolveScriptable(prop, value, target, receiver);\n  }\n  if (isArray(value) && value.length) {\n    value = _resolveArray(prop, value, target, descriptors.isIndexable);\n  }\n  if (needsSubResolver(prop, value)) {\n    value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n  }\n  return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n  const {_proxy, _context, _subProxy, _stack} = target;\n  if (_stack.has(prop)) {\n    throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n  }\n  _stack.add(prop);\n  value = value(_context, _subProxy || receiver);\n  _stack.delete(prop);\n  if (needsSubResolver(prop, value)) {\n    value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n  }\n  return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  if (defined(_context.index) && isIndexable(prop)) {\n    value = value[_context.index % value.length];\n  } else if (isObject(value[0])) {\n    const arr = value;\n    const scopes = _proxy._scopes.filter(s => s !== arr);\n    value = [];\n    for (const item of arr) {\n      const resolver = createSubResolver(scopes, _proxy, prop, item);\n      value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n    }\n  }\n  return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n  return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n  : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n  for (const parent of parentScopes) {\n    const scope = getScope(key, parent);\n    if (scope) {\n      set.add(scope);\n      const fallback = resolveFallback(scope._fallback, key, value);\n      if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n        return fallback;\n      }\n    } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n      return null;\n    }\n  }\n  return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n  const rootScopes = resolver._rootScopes;\n  const fallback = resolveFallback(resolver._fallback, prop, value);\n  const allScopes = [...parentScopes, ...rootScopes];\n  const set = new Set();\n  set.add(value);\n  let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n  if (key === null) {\n    return false;\n  }\n  if (defined(fallback) && fallback !== prop) {\n    key = addScopesFromKey(set, allScopes, fallback, key, value);\n    if (key === null) {\n      return false;\n    }\n  }\n  return _createResolver(Array.from(set), [''], rootScopes, fallback,\n    () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n  while (key) {\n    key = addScopes(set, allScopes, key, fallback, item);\n  }\n  return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n  const parent = resolver._getTarget();\n  if (!(prop in parent)) {\n    parent[prop] = {};\n  }\n  const target = parent[prop];\n  if (isArray(target) && isObject(value)) {\n    return value;\n  }\n  return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n  let value;\n  for (const prefix of prefixes) {\n    value = _resolve(readKey(prefix, prop), scopes);\n    if (defined(value)) {\n      return needsSubResolver(prop, value)\n        ? createSubResolver(scopes, proxy, prop, value)\n        : value;\n    }\n  }\n}\nfunction _resolve(key, scopes) {\n  for (const scope of scopes) {\n    if (!scope) {\n      continue;\n    }\n    const value = scope[key];\n    if (defined(value)) {\n      return value;\n    }\n  }\n}\nfunction getKeysFromAllScopes(target) {\n  let keys = target._keys;\n  if (!keys) {\n    keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n  }\n  return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n  const set = new Set();\n  for (const scope of scopes) {\n    for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n      set.add(key);\n    }\n  }\n  return Array.from(set);\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n  const previous = firstPoint.skip ? middlePoint : firstPoint;\n  const current = middlePoint;\n  const next = afterPoint.skip ? middlePoint : afterPoint;\n  const d01 = distanceBetweenPoints(current, previous);\n  const d12 = distanceBetweenPoints(next, current);\n  let s01 = d01 / (d01 + d12);\n  let s12 = d12 / (d01 + d12);\n  s01 = isNaN(s01) ? 0 : s01;\n  s12 = isNaN(s12) ? 0 : s12;\n  const fa = t * s01;\n  const fb = t * s12;\n  return {\n    previous: {\n      x: current.x - fa * (next.x - previous.x),\n      y: current.y - fa * (next.y - previous.y)\n    },\n    next: {\n      x: current.x + fb * (next.x - previous.x),\n      y: current.y + fb * (next.y - previous.y)\n    }\n  };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n  const pointsLen = points.length;\n  let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen - 1; ++i) {\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent || !pointAfter) {\n      continue;\n    }\n    if (almostEquals(deltaK[i], 0, EPSILON)) {\n      mK[i] = mK[i + 1] = 0;\n      continue;\n    }\n    alphaK = mK[i] / deltaK[i];\n    betaK = mK[i + 1] / deltaK[i];\n    squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n    if (squaredMagnitude <= 9) {\n      continue;\n    }\n    tauK = 3 / Math.sqrt(squaredMagnitude);\n    mK[i] = alphaK * tauK * deltaK[i];\n    mK[i + 1] = betaK * tauK * deltaK[i];\n  }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  let delta, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    const iPixel = pointCurrent[indexAxis];\n    const vPixel = pointCurrent[valueAxis];\n    if (pointBefore) {\n      delta = (iPixel - pointBefore[indexAxis]) / 3;\n      pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n      pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n    }\n    if (pointAfter) {\n      delta = (pointAfter[indexAxis] - iPixel) / 3;\n      pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n      pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n    }\n  }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  const deltaK = Array(pointsLen).fill(0);\n  const mK = Array(pointsLen);\n  let i, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    if (pointAfter) {\n      const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n      deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n    }\n    mK[i] = !pointBefore ? deltaK[i]\n      : !pointAfter ? deltaK[i - 1]\n      : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n      : (deltaK[i - 1] + deltaK[i]) / 2;\n  }\n  monotoneAdjust(points, deltaK, mK);\n  monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n  return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n  let i, ilen, point, inArea, inAreaPrev;\n  let inAreaNext = _isPointInArea(points[0], area);\n  for (i = 0, ilen = points.length; i < ilen; ++i) {\n    inAreaPrev = inArea;\n    inArea = inAreaNext;\n    inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n    if (!inArea) {\n      continue;\n    }\n    point = points[i];\n    if (inAreaPrev) {\n      point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n      point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n    }\n    if (inAreaNext) {\n      point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n      point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n    }\n  }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n  let i, ilen, point, controlPoints;\n  if (options.spanGaps) {\n    points = points.filter((pt) => !pt.skip);\n  }\n  if (options.cubicInterpolationMode === 'monotone') {\n    splineCurveMonotone(points, indexAxis);\n  } else {\n    let prev = loop ? points[points.length - 1] : points[0];\n    for (i = 0, ilen = points.length; i < ilen; ++i) {\n      point = points[i];\n      controlPoints = splineCurve(\n        prev,\n        point,\n        points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n        options.tension\n      );\n      point.cp1x = controlPoints.previous.x;\n      point.cp1y = controlPoints.previous.y;\n      point.cp2x = controlPoints.next.x;\n      point.cp2y = controlPoints.next.y;\n      prev = point;\n    }\n  }\n  if (options.capBezierPoints) {\n    capBezierPoints(points, area);\n  }\n}\n\nfunction _isDomSupported() {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n  let parent = domNode.parentNode;\n  if (parent && parent.toString() === '[object ShadowRoot]') {\n    parent = parent.host;\n  }\n  return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n  let valueInPixels;\n  if (typeof styleValue === 'string') {\n    valueInPixels = parseInt(styleValue, 10);\n    if (styleValue.indexOf('%') !== -1) {\n      valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n    }\n  } else {\n    valueInPixels = styleValue;\n  }\n  return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n  return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n  const result = {};\n  suffix = suffix ? '-' + suffix : '';\n  for (let i = 0; i < 4; i++) {\n    const pos = positions[i];\n    result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n  }\n  result.width = result.left + result.right;\n  result.height = result.top + result.bottom;\n  return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n  const e = evt.native || evt;\n  const touches = e.touches;\n  const source = touches && touches.length ? touches[0] : e;\n  const {offsetX, offsetY} = source;\n  let box = false;\n  let x, y;\n  if (useOffsetPos(offsetX, offsetY, e.target)) {\n    x = offsetX;\n    y = offsetY;\n  } else {\n    const rect = canvas.getBoundingClientRect();\n    x = source.clientX - rect.left;\n    y = source.clientY - rect.top;\n    box = true;\n  }\n  return {x, y, box};\n}\nfunction getRelativePosition(evt, chart) {\n  const {canvas, currentDevicePixelRatio} = chart;\n  const style = getComputedStyle(canvas);\n  const borderBox = style.boxSizing === 'border-box';\n  const paddings = getPositionedStyle(style, 'padding');\n  const borders = getPositionedStyle(style, 'border', 'width');\n  const {x, y, box} = getCanvasPosition(evt, canvas);\n  const xOffset = paddings.left + (box && borders.left);\n  const yOffset = paddings.top + (box && borders.top);\n  let {width, height} = chart;\n  if (borderBox) {\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  return {\n    x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n    y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n  };\n}\nfunction getContainerSize(canvas, width, height) {\n  let maxWidth, maxHeight;\n  if (width === undefined || height === undefined) {\n    const container = _getParentNode(canvas);\n    if (!container) {\n      width = canvas.clientWidth;\n      height = canvas.clientHeight;\n    } else {\n      const rect = container.getBoundingClientRect();\n      const containerStyle = getComputedStyle(container);\n      const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n      const containerPadding = getPositionedStyle(containerStyle, 'padding');\n      width = rect.width - containerPadding.width - containerBorder.width;\n      height = rect.height - containerPadding.height - containerBorder.height;\n      maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n      maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n    }\n  }\n  return {\n    width,\n    height,\n    maxWidth: maxWidth || INFINITY,\n    maxHeight: maxHeight || INFINITY\n  };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n  const style = getComputedStyle(canvas);\n  const margins = getPositionedStyle(style, 'margin');\n  const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n  const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n  const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n  let {width, height} = containerSize;\n  if (style.boxSizing === 'content-box') {\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const paddings = getPositionedStyle(style, 'padding');\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  width = Math.max(0, width - margins.width);\n  height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n  width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n  height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n  if (width && !height) {\n    height = round1(width / 2);\n  }\n  return {\n    width,\n    height\n  };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n  const pixelRatio = forceRatio || 1;\n  const deviceHeight = Math.floor(chart.height * pixelRatio);\n  const deviceWidth = Math.floor(chart.width * pixelRatio);\n  chart.height = deviceHeight / pixelRatio;\n  chart.width = deviceWidth / pixelRatio;\n  const canvas = chart.canvas;\n  if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n    canvas.style.height = `${chart.height}px`;\n    canvas.style.width = `${chart.width}px`;\n  }\n  if (chart.currentDevicePixelRatio !== pixelRatio\n      || canvas.height !== deviceHeight\n      || canvas.width !== deviceWidth) {\n    chart.currentDevicePixelRatio = pixelRatio;\n    canvas.height = deviceHeight;\n    canvas.width = deviceWidth;\n    chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n    return true;\n  }\n  return false;\n}\nconst supportsEventListenerOptions = (function() {\n  let passiveSupported = false;\n  try {\n    const options = {\n      get passive() {\n        passiveSupported = true;\n        return false;\n      }\n    };\n    window.addEventListener('test', null, options);\n    window.removeEventListener('test', null, options);\n  } catch (e) {\n  }\n  return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n  const value = getStyle(element, property);\n  const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n  return matches ? +matches[1] : undefined;\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: p1.y + t * (p2.y - p1.y)\n  };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n    : mode === 'after' ? t < 1 ? p1.y : p2.y\n    : t > 0 ? p2.y : p1.y\n  };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n  const cp1 = {x: p1.cp2x, y: p1.cp2y};\n  const cp2 = {x: p2.cp1x, y: p2.cp1y};\n  const a = _pointInLine(p1, cp1, t);\n  const b = _pointInLine(cp1, cp2, t);\n  const c = _pointInLine(cp2, p2, t);\n  const d = _pointInLine(a, b, t);\n  const e = _pointInLine(b, c, t);\n  return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n  options = options || {};\n  const cacheKey = locale + JSON.stringify(options);\n  let formatter = intlCache.get(cacheKey);\n  if (!formatter) {\n    formatter = new Intl.NumberFormat(locale, options);\n    intlCache.set(cacheKey, formatter);\n  }\n  return formatter;\n}\nfunction formatNumber(num, locale, options) {\n  return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n  return {\n    x(x) {\n      return rectX + rectX + width - x;\n    },\n    setWidth(w) {\n      width = w;\n    },\n    textAlign(align) {\n      if (align === 'center') {\n        return align;\n      }\n      return align === 'right' ? 'left' : 'right';\n    },\n    xPlus(x, value) {\n      return x - value;\n    },\n    leftForLtr(x, itemWidth) {\n      return x - itemWidth;\n    },\n  };\n};\nconst getLeftToRightAdapter = function() {\n  return {\n    x(x) {\n      return x;\n    },\n    setWidth(w) {\n    },\n    textAlign(align) {\n      return align;\n    },\n    xPlus(x, value) {\n      return x + value;\n    },\n    leftForLtr(x, _itemWidth) {\n      return x;\n    },\n  };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n  return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n  let style, original;\n  if (direction === 'ltr' || direction === 'rtl') {\n    style = ctx.canvas.style;\n    original = [\n      style.getPropertyValue('direction'),\n      style.getPropertyPriority('direction'),\n    ];\n    style.setProperty('direction', direction, 'important');\n    ctx.prevTextDirection = original;\n  }\n}\nfunction restoreTextDirection(ctx, original) {\n  if (original !== undefined) {\n    delete ctx.prevTextDirection;\n    ctx.canvas.style.setProperty('direction', original[0], original[1]);\n  }\n}\n\nfunction propertyFn(property) {\n  if (property === 'angle') {\n    return {\n      between: _angleBetween,\n      compare: _angleDiff,\n      normalize: _normalizeAngle,\n    };\n  }\n  return {\n    between: _isBetween,\n    compare: (a, b) => a - b,\n    normalize: x => x\n  };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n  return {\n    start: start % count,\n    end: end % count,\n    loop: loop && (end - start + 1) % count === 0,\n    style\n  };\n}\nfunction getSegment(segment, points, bounds) {\n  const {property, start: startBound, end: endBound} = bounds;\n  const {between, normalize} = propertyFn(property);\n  const count = points.length;\n  let {start, end, loop} = segment;\n  let i, ilen;\n  if (loop) {\n    start += count;\n    end += count;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n        break;\n      }\n      start--;\n      end--;\n    }\n    start %= count;\n    end %= count;\n  }\n  if (end < start) {\n    end += count;\n  }\n  return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n  if (!bounds) {\n    return [segment];\n  }\n  const {property, start: startBound, end: endBound} = bounds;\n  const count = points.length;\n  const {compare, between, normalize} = propertyFn(property);\n  const {start, end, loop, style} = getSegment(segment, points, bounds);\n  const result = [];\n  let inside = false;\n  let subStart = null;\n  let value, point, prevValue;\n  const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n  const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n  const shouldStart = () => inside || startIsBefore();\n  const shouldStop = () => !inside || endIsBefore();\n  for (let i = start, prev = start; i <= end; ++i) {\n    point = points[i % count];\n    if (point.skip) {\n      continue;\n    }\n    value = normalize(point[property]);\n    if (value === prevValue) {\n      continue;\n    }\n    inside = between(value, startBound, endBound);\n    if (subStart === null && shouldStart()) {\n      subStart = compare(value, startBound) === 0 ? i : prev;\n    }\n    if (subStart !== null && shouldStop()) {\n      result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n      subStart = null;\n    }\n    prev = i;\n    prevValue = value;\n  }\n  if (subStart !== null) {\n    result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n  }\n  return result;\n}\nfunction _boundSegments(line, bounds) {\n  const result = [];\n  const segments = line.segments;\n  for (let i = 0; i < segments.length; i++) {\n    const sub = _boundSegment(segments[i], line.points, bounds);\n    if (sub.length) {\n      result.push(...sub);\n    }\n  }\n  return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n  let start = 0;\n  let end = count - 1;\n  if (loop && !spanGaps) {\n    while (start < count && !points[start].skip) {\n      start++;\n    }\n  }\n  while (start < count && points[start].skip) {\n    start++;\n  }\n  start %= count;\n  if (loop) {\n    end += start;\n  }\n  while (end > start && points[end % count].skip) {\n    end--;\n  }\n  end %= count;\n  return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n  const count = points.length;\n  const result = [];\n  let last = start;\n  let prev = points[start];\n  let end;\n  for (end = start + 1; end <= max; ++end) {\n    const cur = points[end % count];\n    if (cur.skip || cur.stop) {\n      if (!prev.skip) {\n        loop = false;\n        result.push({start: start % count, end: (end - 1) % count, loop});\n        start = last = cur.stop ? end : null;\n      }\n    } else {\n      last = end;\n      if (prev.skip) {\n        start = end;\n      }\n    }\n    prev = cur;\n  }\n  if (last !== null) {\n    result.push({start: start % count, end: last % count, loop});\n  }\n  return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n  const points = line.points;\n  const spanGaps = line.options.spanGaps;\n  const count = points.length;\n  if (!count) {\n    return [];\n  }\n  const loop = !!line._loop;\n  const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n  if (spanGaps === true) {\n    return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n  }\n  const max = end < start ? end + count : end;\n  const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n  return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n  if (!segmentOptions || !segmentOptions.setContext || !points) {\n    return segments;\n  }\n  return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n  const chartContext = line._chart.getContext();\n  const baseStyle = readStyle(line.options);\n  const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n  const count = points.length;\n  const result = [];\n  let prevStyle = baseStyle;\n  let start = segments[0].start;\n  let i = start;\n  function addStyle(s, e, l, st) {\n    const dir = spanGaps ? -1 : 1;\n    if (s === e) {\n      return;\n    }\n    s += count;\n    while (points[s % count].skip) {\n      s -= dir;\n    }\n    while (points[e % count].skip) {\n      e += dir;\n    }\n    if (s % count !== e % count) {\n      result.push({start: s % count, end: e % count, loop: l, style: st});\n      prevStyle = st;\n      start = e % count;\n    }\n  }\n  for (const segment of segments) {\n    start = spanGaps ? start : segment.start;\n    let prev = points[start % count];\n    let style;\n    for (i = start + 1; i <= segment.end; i++) {\n      const pt = points[i % count];\n      style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n        type: 'segment',\n        p0: prev,\n        p1: pt,\n        p0DataIndex: (i - 1) % count,\n        p1DataIndex: i % count,\n        datasetIndex\n      })));\n      if (styleChanged(style, prevStyle)) {\n        addStyle(start, i - 1, segment.loop, prevStyle);\n      }\n      prev = pt;\n      prevStyle = style;\n    }\n    if (start < i - 1) {\n      addStyle(start, i - 1, segment.loop, prevStyle);\n    }\n  }\n  return result;\n}\nfunction readStyle(options) {\n  return {\n    backgroundColor: options.backgroundColor,\n    borderCapStyle: options.borderCapStyle,\n    borderDash: options.borderDash,\n    borderDashOffset: options.borderDashOffset,\n    borderJoinStyle: options.borderJoinStyle,\n    borderWidth: options.borderWidth,\n    borderColor: options.borderColor\n  };\n}\nfunction styleChanged(style, prevStyle) {\n  return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nexport { _toLeftRightCenter as $, _rlookupByKey as A, getAngleFromPoint as B, toPadding as C, each as D, getMaximumSize as E, _getParentNode as F, readUsedSize as G, HALF_PI as H, throttled as I, supportsEventListenerOptions as J, _isDomSupported as K, log10 as L, _factorize as M, finiteOrDefault as N, callback as O, PI as P, _addGrace as Q, toDegrees as R, _measureText as S, TAU as T, _int16Range as U, _alignPixel as V, clipArea as W, renderText as X, unclipArea as Y, toFont as Z, _arrayUnique as _, resolve as a, _angleDiff as a$, _alignStartEnd as a0, overrides as a1, merge as a2, _capitalize as a3, descriptors as a4, isFunction as a5, _attachContext as a6, _createResolver as a7, _descriptors as a8, mergeIf as a9, restoreTextDirection as aA, noop as aB, distanceBetweenPoints as aC, _setMinAndMaxByKey as aD, niceNum as aE, almostWhole as aF, almostEquals as aG, _decimalPlaces as aH, _longestText as aI, _filterBetween as aJ, _lookup as aK, getHoverColor as aL, clone$1 as aM, _merger as aN, _mergerIf as aO, _deprecated as aP, toFontString as aQ, splineCurve as aR, splineCurveMonotone as aS, getStyle as aT, fontString as aU, toLineHeight as aV, PITAU as aW, INFINITY as aX, RAD_PER_DEG as aY, QUARTER_PI as aZ, TWO_THIRDS_PI as a_, uid as aa, debounce as ab, retinaScale as ac, clearCanvas as ad, setsEqual as ae, _elementsEqual as af, _isClickEvent as ag, _isBetween as ah, _readValueToProps as ai, _updateBezierControlPoints as aj, _computeSegments as ak, _boundSegments as al, _steppedInterpolation as am, _bezierInterpolation as an, _pointInLine as ao, _steppedLineTo as ap, _bezierCurveTo as aq, drawPoint as ar, addRoundedRectPath as as, toTRBL as at, toTRBLCorners as au, _boundSegment as av, _normalizeAngle as aw, getRtlAdapter as ax, overrideTextDirection as ay, _textX as az, isArray as b, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, createContext as h, isObject as i, defined as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, isNumber as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _limitValue as w, _lookupByKey as x, getRelativePosition as y, _isPointInArea as z };\n","/*!\n * Chart.js v3.7.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, d as defaults, i as isObject, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as createContext, j as defined, s as sign, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as isNumber, w as _limitValue, x as _lookupByKey, y as getRelativePosition$1, z as _isPointInArea, A as _rlookupByKey, B as getAngleFromPoint, C as toPadding, D as each, E as getMaximumSize, F as _getParentNode, G as readUsedSize, I as throttled, J as supportsEventListenerOptions, K as _isDomSupported, L as log10, M as _factorize, N as finiteOrDefault, O as callback, Q as _addGrace, R as toDegrees, S as _measureText, U as _int16Range, V as _alignPixel, W as clipArea, X as renderText, Y as unclipArea, Z as toFont, $ as _toLeftRightCenter, a0 as _alignStartEnd, a1 as overrides, a2 as merge, a3 as _capitalize, a4 as descriptors, a5 as isFunction, a6 as _attachContext, a7 as _createResolver, a8 as _descriptors, a9 as mergeIf, aa as uid, ab as debounce, ac as retinaScale, ad as clearCanvas, ae as setsEqual, af as _elementsEqual, ag as _isClickEvent, ah as _isBetween, ai as _readValueToProps, aj as _updateBezierControlPoints, ak as _computeSegments, al as _boundSegments, am as _steppedInterpolation, an as _bezierInterpolation, ao as _pointInLine, ap as _steppedLineTo, aq as _bezierCurveTo, ar as drawPoint, as as addRoundedRectPath, at as toTRBL, au as toTRBLCorners, av as _boundSegment, aw as _normalizeAngle, ax as getRtlAdapter, ay as overrideTextDirection, az as _textX, aA as restoreTextDirection, aB as noop, aC as distanceBetweenPoints, aD as _setMinAndMaxByKey, aE as niceNum, aF as almostWhole, aG as almostEquals, aH as _decimalPlaces, aI as _longestText, aJ as _filterBetween, aK as _lookup } from './chunks/helpers.segment.js';\nexport { d as defaults } from './chunks/helpers.segment.js';\n\nclass Animator {\n  constructor() {\n    this._request = null;\n    this._charts = new Map();\n    this._running = false;\n    this._lastDate = undefined;\n  }\n  _notify(chart, anims, date, type) {\n    const callbacks = anims.listeners[type];\n    const numSteps = anims.duration;\n    callbacks.forEach(fn => fn({\n      chart,\n      initial: anims.initial,\n      numSteps,\n      currentStep: Math.min(date - anims.start, numSteps)\n    }));\n  }\n  _refresh() {\n    if (this._request) {\n      return;\n    }\n    this._running = true;\n    this._request = requestAnimFrame.call(window, () => {\n      this._update();\n      this._request = null;\n      if (this._running) {\n        this._refresh();\n      }\n    });\n  }\n  _update(date = Date.now()) {\n    let remaining = 0;\n    this._charts.forEach((anims, chart) => {\n      if (!anims.running || !anims.items.length) {\n        return;\n      }\n      const items = anims.items;\n      let i = items.length - 1;\n      let draw = false;\n      let item;\n      for (; i >= 0; --i) {\n        item = items[i];\n        if (item._active) {\n          if (item._total > anims.duration) {\n            anims.duration = item._total;\n          }\n          item.tick(date);\n          draw = true;\n        } else {\n          items[i] = items[items.length - 1];\n          items.pop();\n        }\n      }\n      if (draw) {\n        chart.draw();\n        this._notify(chart, anims, date, 'progress');\n      }\n      if (!items.length) {\n        anims.running = false;\n        this._notify(chart, anims, date, 'complete');\n        anims.initial = false;\n      }\n      remaining += items.length;\n    });\n    this._lastDate = date;\n    if (remaining === 0) {\n      this._running = false;\n    }\n  }\n  _getAnims(chart) {\n    const charts = this._charts;\n    let anims = charts.get(chart);\n    if (!anims) {\n      anims = {\n        running: false,\n        initial: true,\n        items: [],\n        listeners: {\n          complete: [],\n          progress: []\n        }\n      };\n      charts.set(chart, anims);\n    }\n    return anims;\n  }\n  listen(chart, event, cb) {\n    this._getAnims(chart).listeners[event].push(cb);\n  }\n  add(chart, items) {\n    if (!items || !items.length) {\n      return;\n    }\n    this._getAnims(chart).items.push(...items);\n  }\n  has(chart) {\n    return this._getAnims(chart).items.length > 0;\n  }\n  start(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims) {\n      return;\n    }\n    anims.running = true;\n    anims.start = Date.now();\n    anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n    this._refresh();\n  }\n  running(chart) {\n    if (!this._running) {\n      return false;\n    }\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.running || !anims.items.length) {\n      return false;\n    }\n    return true;\n  }\n  stop(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.items.length) {\n      return;\n    }\n    const items = anims.items;\n    let i = items.length - 1;\n    for (; i >= 0; --i) {\n      items[i].cancel();\n    }\n    anims.items = [];\n    this._notify(chart, anims, Date.now(), 'complete');\n  }\n  remove(chart) {\n    return this._charts.delete(chart);\n  }\n}\nvar animator = new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n  boolean(from, to, factor) {\n    return factor > 0.5 ? to : from;\n  },\n  color(from, to, factor) {\n    const c0 = color(from || transparent);\n    const c1 = c0.valid && color(to || transparent);\n    return c1 && c1.valid\n      ? c1.mix(c0, factor).hexString()\n      : to;\n  },\n  number(from, to, factor) {\n    return from + (to - from) * factor;\n  }\n};\nclass Animation {\n  constructor(cfg, target, prop, to) {\n    const currentValue = target[prop];\n    to = resolve([cfg.to, to, currentValue, cfg.from]);\n    const from = resolve([cfg.from, currentValue, to]);\n    this._active = true;\n    this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n    this._easing = effects[cfg.easing] || effects.linear;\n    this._start = Math.floor(Date.now() + (cfg.delay || 0));\n    this._duration = this._total = Math.floor(cfg.duration);\n    this._loop = !!cfg.loop;\n    this._target = target;\n    this._prop = prop;\n    this._from = from;\n    this._to = to;\n    this._promises = undefined;\n  }\n  active() {\n    return this._active;\n  }\n  update(cfg, to, date) {\n    if (this._active) {\n      this._notify(false);\n      const currentValue = this._target[this._prop];\n      const elapsed = date - this._start;\n      const remain = this._duration - elapsed;\n      this._start = date;\n      this._duration = Math.floor(Math.max(remain, cfg.duration));\n      this._total += elapsed;\n      this._loop = !!cfg.loop;\n      this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n      this._from = resolve([cfg.from, currentValue, to]);\n    }\n  }\n  cancel() {\n    if (this._active) {\n      this.tick(Date.now());\n      this._active = false;\n      this._notify(false);\n    }\n  }\n  tick(date) {\n    const elapsed = date - this._start;\n    const duration = this._duration;\n    const prop = this._prop;\n    const from = this._from;\n    const loop = this._loop;\n    const to = this._to;\n    let factor;\n    this._active = from !== to && (loop || (elapsed < duration));\n    if (!this._active) {\n      this._target[prop] = to;\n      this._notify(true);\n      return;\n    }\n    if (elapsed < 0) {\n      this._target[prop] = from;\n      return;\n    }\n    factor = (elapsed / duration) % 2;\n    factor = loop && factor > 1 ? 2 - factor : factor;\n    factor = this._easing(Math.min(1, Math.max(0, factor)));\n    this._target[prop] = this._fn(from, to, factor);\n  }\n  wait() {\n    const promises = this._promises || (this._promises = []);\n    return new Promise((res, rej) => {\n      promises.push({res, rej});\n    });\n  }\n  _notify(resolved) {\n    const method = resolved ? 'res' : 'rej';\n    const promises = this._promises || [];\n    for (let i = 0; i < promises.length; i++) {\n      promises[i][method]();\n    }\n  }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n  delay: undefined,\n  duration: 1000,\n  easing: 'easeOutQuart',\n  fn: undefined,\n  from: undefined,\n  loop: undefined,\n  to: undefined,\n  type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n  _fallback: false,\n  _indexable: false,\n  _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n  colors: {\n    type: 'color',\n    properties: colors\n  },\n  numbers: {\n    type: 'number',\n    properties: numbers\n  },\n});\ndefaults.describe('animations', {\n  _fallback: 'animation',\n});\ndefaults.set('transitions', {\n  active: {\n    animation: {\n      duration: 400\n    }\n  },\n  resize: {\n    animation: {\n      duration: 0\n    }\n  },\n  show: {\n    animations: {\n      colors: {\n        from: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        duration: 0\n      },\n    }\n  },\n  hide: {\n    animations: {\n      colors: {\n        to: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        easing: 'linear',\n        fn: v => v | 0\n      },\n    }\n  }\n});\nclass Animations {\n  constructor(chart, config) {\n    this._chart = chart;\n    this._properties = new Map();\n    this.configure(config);\n  }\n  configure(config) {\n    if (!isObject(config)) {\n      return;\n    }\n    const animatedProps = this._properties;\n    Object.getOwnPropertyNames(config).forEach(key => {\n      const cfg = config[key];\n      if (!isObject(cfg)) {\n        return;\n      }\n      const resolved = {};\n      for (const option of animationOptions) {\n        resolved[option] = cfg[option];\n      }\n      (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n        if (prop === key || !animatedProps.has(prop)) {\n          animatedProps.set(prop, resolved);\n        }\n      });\n    });\n  }\n  _animateOptions(target, values) {\n    const newOptions = values.options;\n    const options = resolveTargetOptions(target, newOptions);\n    if (!options) {\n      return [];\n    }\n    const animations = this._createAnimations(options, newOptions);\n    if (newOptions.$shared) {\n      awaitAll(target.options.$animations, newOptions).then(() => {\n        target.options = newOptions;\n      }, () => {\n      });\n    }\n    return animations;\n  }\n  _createAnimations(target, values) {\n    const animatedProps = this._properties;\n    const animations = [];\n    const running = target.$animations || (target.$animations = {});\n    const props = Object.keys(values);\n    const date = Date.now();\n    let i;\n    for (i = props.length - 1; i >= 0; --i) {\n      const prop = props[i];\n      if (prop.charAt(0) === '$') {\n        continue;\n      }\n      if (prop === 'options') {\n        animations.push(...this._animateOptions(target, values));\n        continue;\n      }\n      const value = values[prop];\n      let animation = running[prop];\n      const cfg = animatedProps.get(prop);\n      if (animation) {\n        if (cfg && animation.active()) {\n          animation.update(cfg, value, date);\n          continue;\n        } else {\n          animation.cancel();\n        }\n      }\n      if (!cfg || !cfg.duration) {\n        target[prop] = value;\n        continue;\n      }\n      running[prop] = animation = new Animation(cfg, target, prop, value);\n      animations.push(animation);\n    }\n    return animations;\n  }\n  update(target, values) {\n    if (this._properties.size === 0) {\n      Object.assign(target, values);\n      return;\n    }\n    const animations = this._createAnimations(target, values);\n    if (animations.length) {\n      animator.add(this._chart, animations);\n      return true;\n    }\n  }\n}\nfunction awaitAll(animations, properties) {\n  const running = [];\n  const keys = Object.keys(properties);\n  for (let i = 0; i < keys.length; i++) {\n    const anim = animations[keys[i]];\n    if (anim && anim.active()) {\n      running.push(anim.wait());\n    }\n  }\n  return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n  if (!newOptions) {\n    return;\n  }\n  let options = target.options;\n  if (!options) {\n    target.options = newOptions;\n    return;\n  }\n  if (options.$shared) {\n    target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n  }\n  return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n  const opts = scale && scale.options || {};\n  const reverse = opts.reverse;\n  const min = opts.min === undefined ? allowedOverflow : 0;\n  const max = opts.max === undefined ? allowedOverflow : 0;\n  return {\n    start: reverse ? max : min,\n    end: reverse ? min : max\n  };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n  if (allowedOverflow === false) {\n    return false;\n  }\n  const x = scaleClip(xScale, allowedOverflow);\n  const y = scaleClip(yScale, allowedOverflow);\n  return {\n    top: y.end,\n    right: x.end,\n    bottom: y.start,\n    left: x.start\n  };\n}\nfunction toClip(value) {\n  let t, r, b, l;\n  if (isObject(value)) {\n    t = value.top;\n    r = value.right;\n    b = value.bottom;\n    l = value.left;\n  } else {\n    t = r = b = l = value;\n  }\n  return {\n    top: t,\n    right: r,\n    bottom: b,\n    left: l,\n    disabled: value === false\n  };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n  const keys = [];\n  const metasets = chart._getSortedDatasetMetas(filterVisible);\n  let i, ilen;\n  for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n    keys.push(metasets[i].index);\n  }\n  return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n  const keys = stack.keys;\n  const singleMode = options.mode === 'single';\n  let i, ilen, datasetIndex, otherValue;\n  if (value === null) {\n    return;\n  }\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    datasetIndex = +keys[i];\n    if (datasetIndex === dsIndex) {\n      if (options.all) {\n        continue;\n      }\n      break;\n    }\n    otherValue = stack.values[datasetIndex];\n    if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n      value += otherValue;\n    }\n  }\n  return value;\n}\nfunction convertObjectDataToArray(data) {\n  const keys = Object.keys(data);\n  const adata = new Array(keys.length);\n  let i, ilen, key;\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    key = keys[i];\n    adata[i] = {\n      x: key,\n      y: data[key]\n    };\n  }\n  return adata;\n}\nfunction isStacked(scale, meta) {\n  const stacked = scale && scale.options.stacked;\n  return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n  return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n  const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n  return {\n    min: minDefined ? min : Number.NEGATIVE_INFINITY,\n    max: maxDefined ? max : Number.POSITIVE_INFINITY\n  };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n  const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n  return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n  for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n    const value = stack[meta.index];\n    if ((positive && value > 0) || (!positive && value < 0)) {\n      return meta.index;\n    }\n  }\n  return null;\n}\nfunction updateStacks(controller, parsed) {\n  const {chart, _cachedMeta: meta} = controller;\n  const stacks = chart._stacks || (chart._stacks = {});\n  const {iScale, vScale, index: datasetIndex} = meta;\n  const iAxis = iScale.axis;\n  const vAxis = vScale.axis;\n  const key = getStackKey(iScale, vScale, meta);\n  const ilen = parsed.length;\n  let stack;\n  for (let i = 0; i < ilen; ++i) {\n    const item = parsed[i];\n    const {[iAxis]: index, [vAxis]: value} = item;\n    const itemStacks = item._stacks || (item._stacks = {});\n    stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n    stack[datasetIndex] = value;\n    stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n    stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n  }\n}\nfunction getFirstScaleId(chart, axis) {\n  const scales = chart.scales;\n  return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n  return createContext(parent,\n    {\n      active: false,\n      dataset: undefined,\n      datasetIndex: index,\n      index,\n      mode: 'default',\n      type: 'dataset'\n    }\n  );\n}\nfunction createDataContext(parent, index, element) {\n  return createContext(parent, {\n    active: false,\n    dataIndex: index,\n    parsed: undefined,\n    raw: undefined,\n    element,\n    index,\n    mode: 'default',\n    type: 'data'\n  });\n}\nfunction clearStacks(meta, items) {\n  const datasetIndex = meta.controller.index;\n  const axis = meta.vScale && meta.vScale.axis;\n  if (!axis) {\n    return;\n  }\n  items = items || meta._parsed;\n  for (const parsed of items) {\n    const stacks = parsed._stacks;\n    if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n      return;\n    }\n    delete stacks[axis][datasetIndex];\n  }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n  && {keys: getSortedDatasetIndices(chart, true), values: null};\nclass DatasetController {\n  constructor(chart, datasetIndex) {\n    this.chart = chart;\n    this._ctx = chart.ctx;\n    this.index = datasetIndex;\n    this._cachedDataOpts = {};\n    this._cachedMeta = this.getMeta();\n    this._type = this._cachedMeta.type;\n    this.options = undefined;\n    this._parsing = false;\n    this._data = undefined;\n    this._objectData = undefined;\n    this._sharedOptions = undefined;\n    this._drawStart = undefined;\n    this._drawCount = undefined;\n    this.enableOptionSharing = false;\n    this.$context = undefined;\n    this._syncList = [];\n    this.initialize();\n  }\n  initialize() {\n    const meta = this._cachedMeta;\n    this.configure();\n    this.linkScales();\n    meta._stacked = isStacked(meta.vScale, meta);\n    this.addElements();\n  }\n  updateIndex(datasetIndex) {\n    if (this.index !== datasetIndex) {\n      clearStacks(this._cachedMeta);\n    }\n    this.index = datasetIndex;\n  }\n  linkScales() {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n    const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n    const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n    const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n    const indexAxis = meta.indexAxis;\n    const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n    const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n    meta.xScale = this.getScaleForId(xid);\n    meta.yScale = this.getScaleForId(yid);\n    meta.rScale = this.getScaleForId(rid);\n    meta.iScale = this.getScaleForId(iid);\n    meta.vScale = this.getScaleForId(vid);\n  }\n  getDataset() {\n    return this.chart.data.datasets[this.index];\n  }\n  getMeta() {\n    return this.chart.getDatasetMeta(this.index);\n  }\n  getScaleForId(scaleID) {\n    return this.chart.scales[scaleID];\n  }\n  _getOtherScale(scale) {\n    const meta = this._cachedMeta;\n    return scale === meta.iScale\n      ? meta.vScale\n      : meta.iScale;\n  }\n  reset() {\n    this._update('reset');\n  }\n  _destroy() {\n    const meta = this._cachedMeta;\n    if (this._data) {\n      unlistenArrayEvents(this._data, this);\n    }\n    if (meta._stacked) {\n      clearStacks(meta);\n    }\n  }\n  _dataCheck() {\n    const dataset = this.getDataset();\n    const data = dataset.data || (dataset.data = []);\n    const _data = this._data;\n    if (isObject(data)) {\n      this._data = convertObjectDataToArray(data);\n    } else if (_data !== data) {\n      if (_data) {\n        unlistenArrayEvents(_data, this);\n        const meta = this._cachedMeta;\n        clearStacks(meta);\n        meta._parsed = [];\n      }\n      if (data && Object.isExtensible(data)) {\n        listenArrayEvents(data, this);\n      }\n      this._syncList = [];\n      this._data = data;\n    }\n  }\n  addElements() {\n    const meta = this._cachedMeta;\n    this._dataCheck();\n    if (this.datasetElementType) {\n      meta.dataset = new this.datasetElementType();\n    }\n  }\n  buildOrUpdateElements(resetNewElements) {\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    let stackChanged = false;\n    this._dataCheck();\n    const oldStacked = meta._stacked;\n    meta._stacked = isStacked(meta.vScale, meta);\n    if (meta.stack !== dataset.stack) {\n      stackChanged = true;\n      clearStacks(meta);\n      meta.stack = dataset.stack;\n    }\n    this._resyncElements(resetNewElements);\n    if (stackChanged || oldStacked !== meta._stacked) {\n      updateStacks(this, meta._parsed);\n    }\n  }\n  configure() {\n    const config = this.chart.config;\n    const scopeKeys = config.datasetScopeKeys(this._type);\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n    this.options = config.createResolver(scopes, this.getContext());\n    this._parsing = this.options.parsing;\n    this._cachedDataOpts = {};\n  }\n  parse(start, count) {\n    const {_cachedMeta: meta, _data: data} = this;\n    const {iScale, _stacked} = meta;\n    const iAxis = iScale.axis;\n    let sorted = start === 0 && count === data.length ? true : meta._sorted;\n    let prev = start > 0 && meta._parsed[start - 1];\n    let i, cur, parsed;\n    if (this._parsing === false) {\n      meta._parsed = data;\n      meta._sorted = true;\n      parsed = data;\n    } else {\n      if (isArray(data[start])) {\n        parsed = this.parseArrayData(meta, data, start, count);\n      } else if (isObject(data[start])) {\n        parsed = this.parseObjectData(meta, data, start, count);\n      } else {\n        parsed = this.parsePrimitiveData(meta, data, start, count);\n      }\n      const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n      for (i = 0; i < count; ++i) {\n        meta._parsed[i + start] = cur = parsed[i];\n        if (sorted) {\n          if (isNotInOrderComparedToPrev()) {\n            sorted = false;\n          }\n          prev = cur;\n        }\n      }\n      meta._sorted = sorted;\n    }\n    if (_stacked) {\n      updateStacks(this, parsed);\n    }\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = new Array(count);\n    let i, ilen, index;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      parsed[i] = {\n        [iAxis]: singleScale || iScale.parse(labels[index], index),\n        [vAxis]: vScale.parse(data[index], index)\n      };\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(item[0], index),\n        y: yScale.parse(item[1], index)\n      };\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n        y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n      };\n    }\n    return parsed;\n  }\n  getParsed(index) {\n    return this._cachedMeta._parsed[index];\n  }\n  getDataElement(index) {\n    return this._cachedMeta.data[index];\n  }\n  applyStack(scale, parsed, mode) {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const value = parsed[scale.axis];\n    const stack = {\n      keys: getSortedDatasetIndices(chart, true),\n      values: parsed._stacks[scale.axis]\n    };\n    return applyStack(stack, value, meta.index, {mode});\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    const parsedValue = parsed[scale.axis];\n    let value = parsedValue === null ? NaN : parsedValue;\n    const values = stack && parsed._stacks[scale.axis];\n    if (stack && values) {\n      stack.values = values;\n      value = applyStack(stack, parsedValue, this._cachedMeta.index);\n    }\n    range.min = Math.min(range.min, value);\n    range.max = Math.max(range.max, value);\n  }\n  getMinMax(scale, canStack) {\n    const meta = this._cachedMeta;\n    const _parsed = meta._parsed;\n    const sorted = meta._sorted && scale === meta.iScale;\n    const ilen = _parsed.length;\n    const otherScale = this._getOtherScale(scale);\n    const stack = createStack(canStack, meta, this.chart);\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n    const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n    let i, parsed;\n    function _skip() {\n      parsed = _parsed[i];\n      const otherValue = parsed[otherScale.axis];\n      return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n    }\n    for (i = 0; i < ilen; ++i) {\n      if (_skip()) {\n        continue;\n      }\n      this.updateRangeFromParsed(range, scale, parsed, stack);\n      if (sorted) {\n        break;\n      }\n    }\n    if (sorted) {\n      for (i = ilen - 1; i >= 0; --i) {\n        if (_skip()) {\n          continue;\n        }\n        this.updateRangeFromParsed(range, scale, parsed, stack);\n        break;\n      }\n    }\n    return range;\n  }\n  getAllParsedValues(scale) {\n    const parsed = this._cachedMeta._parsed;\n    const values = [];\n    let i, ilen, value;\n    for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n      value = parsed[i][scale.axis];\n      if (isNumberFinite(value)) {\n        values.push(value);\n      }\n    }\n    return values;\n  }\n  getMaxOverflow() {\n    return false;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n      value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n    };\n  }\n  _update(mode) {\n    const meta = this._cachedMeta;\n    this.update(mode || 'default');\n    meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n  }\n  update(mode) {}\n  draw() {\n    const ctx = this._ctx;\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const elements = meta.data || [];\n    const area = chart.chartArea;\n    const active = [];\n    const start = this._drawStart || 0;\n    const count = this._drawCount || (elements.length - start);\n    const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n    let i;\n    if (meta.dataset) {\n      meta.dataset.draw(ctx, area, start, count);\n    }\n    for (i = start; i < start + count; ++i) {\n      const element = elements[i];\n      if (element.hidden) {\n        continue;\n      }\n      if (element.active && drawActiveElementsOnTop) {\n        active.push(element);\n      } else {\n        element.draw(ctx, area);\n      }\n    }\n    for (i = 0; i < active.length; ++i) {\n      active[i].draw(ctx, area);\n    }\n  }\n  getStyle(index, active) {\n    const mode = active ? 'active' : 'default';\n    return index === undefined && this._cachedMeta.dataset\n      ? this.resolveDatasetElementOptions(mode)\n      : this.resolveDataElementOptions(index || 0, mode);\n  }\n  getContext(index, active, mode) {\n    const dataset = this.getDataset();\n    let context;\n    if (index >= 0 && index < this._cachedMeta.data.length) {\n      const element = this._cachedMeta.data[index];\n      context = element.$context ||\n        (element.$context = createDataContext(this.getContext(), index, element));\n      context.parsed = this.getParsed(index);\n      context.raw = dataset.data[index];\n      context.index = context.dataIndex = index;\n    } else {\n      context = this.$context ||\n        (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n      context.dataset = dataset;\n      context.index = context.datasetIndex = this.index;\n    }\n    context.active = !!active;\n    context.mode = mode;\n    return context;\n  }\n  resolveDatasetElementOptions(mode) {\n    return this._resolveElementOptions(this.datasetElementType.id, mode);\n  }\n  resolveDataElementOptions(index, mode) {\n    return this._resolveElementOptions(this.dataElementType.id, mode, index);\n  }\n  _resolveElementOptions(elementType, mode = 'default', index) {\n    const active = mode === 'active';\n    const cache = this._cachedDataOpts;\n    const cacheKey = elementType + '-' + mode;\n    const cached = cache[cacheKey];\n    const sharing = this.enableOptionSharing && defined(index);\n    if (cached) {\n      return cloneIfNotShared(cached, sharing);\n    }\n    const config = this.chart.config;\n    const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n    const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n    const names = Object.keys(defaults.elements[elementType]);\n    const context = () => this.getContext(index, active);\n    const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n    if (values.$shared) {\n      values.$shared = sharing;\n      cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n    }\n    return values;\n  }\n  _resolveAnimations(index, transition, active) {\n    const chart = this.chart;\n    const cache = this._cachedDataOpts;\n    const cacheKey = `animation-${transition}`;\n    const cached = cache[cacheKey];\n    if (cached) {\n      return cached;\n    }\n    let options;\n    if (chart.options.animation !== false) {\n      const config = this.chart.config;\n      const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n      const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n      options = config.createResolver(scopes, this.getContext(index, active, transition));\n    }\n    const animations = new Animations(chart, options && options.animations);\n    if (options && options._cacheable) {\n      cache[cacheKey] = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getSharedOptions(options) {\n    if (!options.$shared) {\n      return;\n    }\n    return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n  }\n  includeOptions(mode, sharedOptions) {\n    return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n  }\n  updateElement(element, index, properties, mode) {\n    if (isDirectUpdateMode(mode)) {\n      Object.assign(element, properties);\n    } else {\n      this._resolveAnimations(index, mode).update(element, properties);\n    }\n  }\n  updateSharedOptions(sharedOptions, mode, newOptions) {\n    if (sharedOptions && !isDirectUpdateMode(mode)) {\n      this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n    }\n  }\n  _setStyle(element, index, mode, active) {\n    element.active = active;\n    const options = this.getStyle(index, active);\n    this._resolveAnimations(index, mode, active).update(element, {\n      options: (!active && this.getSharedOptions(options)) || options\n    });\n  }\n  removeHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', false);\n  }\n  setHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', true);\n  }\n  _removeDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', false);\n    }\n  }\n  _setDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', true);\n    }\n  }\n  _resyncElements(resetNewElements) {\n    const data = this._data;\n    const elements = this._cachedMeta.data;\n    for (const [method, arg1, arg2] of this._syncList) {\n      this[method](arg1, arg2);\n    }\n    this._syncList = [];\n    const numMeta = elements.length;\n    const numData = data.length;\n    const count = Math.min(numData, numMeta);\n    if (count) {\n      this.parse(0, count);\n    }\n    if (numData > numMeta) {\n      this._insertElements(numMeta, numData - numMeta, resetNewElements);\n    } else if (numData < numMeta) {\n      this._removeElements(numData, numMeta - numData);\n    }\n  }\n  _insertElements(start, count, resetNewElements = true) {\n    const meta = this._cachedMeta;\n    const data = meta.data;\n    const end = start + count;\n    let i;\n    const move = (arr) => {\n      arr.length += count;\n      for (i = arr.length - 1; i >= end; i--) {\n        arr[i] = arr[i - count];\n      }\n    };\n    move(data);\n    for (i = start; i < end; ++i) {\n      data[i] = new this.dataElementType();\n    }\n    if (this._parsing) {\n      move(meta._parsed);\n    }\n    this.parse(start, count);\n    if (resetNewElements) {\n      this.updateElements(data, start, count, 'reset');\n    }\n  }\n  updateElements(element, start, count, mode) {}\n  _removeElements(start, count) {\n    const meta = this._cachedMeta;\n    if (this._parsing) {\n      const removed = meta._parsed.splice(start, count);\n      if (meta._stacked) {\n        clearStacks(meta, removed);\n      }\n    }\n    meta.data.splice(start, count);\n  }\n  _sync(args) {\n    if (this._parsing) {\n      this._syncList.push(args);\n    } else {\n      const [method, arg1, arg2] = args;\n      this[method](arg1, arg2);\n    }\n    this.chart._dataChanges.push([this.index, ...args]);\n  }\n  _onDataPush() {\n    const count = arguments.length;\n    this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n  }\n  _onDataPop() {\n    this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n  }\n  _onDataShift() {\n    this._sync(['_removeElements', 0, 1]);\n  }\n  _onDataSplice(start, count) {\n    if (count) {\n      this._sync(['_removeElements', start, count]);\n    }\n    const newCount = arguments.length - 2;\n    if (newCount) {\n      this._sync(['_insertElements', start, newCount]);\n    }\n  }\n  _onDataUnshift() {\n    this._sync(['_insertElements', 0, arguments.length]);\n  }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale, type) {\n  if (!scale._cache.$bar) {\n    const visibleMetas = scale.getMatchingVisibleMetas(type);\n    let values = [];\n    for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n      values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n    }\n    scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n  }\n  return scale._cache.$bar;\n}\nfunction computeMinSampleSize(meta) {\n  const scale = meta.iScale;\n  const values = getAllScaleValues(scale, meta.type);\n  let min = scale._length;\n  let i, ilen, curr, prev;\n  const updateMinAndPrev = () => {\n    if (curr === 32767 || curr === -32768) {\n      return;\n    }\n    if (defined(prev)) {\n      min = Math.min(min, Math.abs(curr - prev) || min);\n    }\n    prev = curr;\n  };\n  for (i = 0, ilen = values.length; i < ilen; ++i) {\n    curr = scale.getPixelForValue(values[i]);\n    updateMinAndPrev();\n  }\n  prev = undefined;\n  for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n    curr = scale.getPixelForTick(i);\n    updateMinAndPrev();\n  }\n  return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n  const thickness = options.barThickness;\n  let size, ratio;\n  if (isNullOrUndef(thickness)) {\n    size = ruler.min * options.categoryPercentage;\n    ratio = options.barPercentage;\n  } else {\n    size = thickness * stackCount;\n    ratio = 1;\n  }\n  return {\n    chunk: size / stackCount,\n    ratio,\n    start: ruler.pixels[index] - (size / 2)\n  };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n  const pixels = ruler.pixels;\n  const curr = pixels[index];\n  let prev = index > 0 ? pixels[index - 1] : null;\n  let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n  const percent = options.categoryPercentage;\n  if (prev === null) {\n    prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n  }\n  if (next === null) {\n    next = curr + curr - prev;\n  }\n  const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n  const size = Math.abs(next - prev) / 2 * percent;\n  return {\n    chunk: size / stackCount,\n    ratio: options.barPercentage,\n    start\n  };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n  const startValue = vScale.parse(entry[0], i);\n  const endValue = vScale.parse(entry[1], i);\n  const min = Math.min(startValue, endValue);\n  const max = Math.max(startValue, endValue);\n  let barStart = min;\n  let barEnd = max;\n  if (Math.abs(min) > Math.abs(max)) {\n    barStart = max;\n    barEnd = min;\n  }\n  item[vScale.axis] = barEnd;\n  item._custom = {\n    barStart,\n    barEnd,\n    start: startValue,\n    end: endValue,\n    min,\n    max\n  };\n}\nfunction parseValue(entry, item, vScale, i) {\n  if (isArray(entry)) {\n    parseFloatBar(entry, item, vScale, i);\n  } else {\n    item[vScale.axis] = vScale.parse(entry, i);\n  }\n  return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n  const iScale = meta.iScale;\n  const vScale = meta.vScale;\n  const labels = iScale.getLabels();\n  const singleScale = iScale === vScale;\n  const parsed = [];\n  let i, ilen, item, entry;\n  for (i = start, ilen = start + count; i < ilen; ++i) {\n    entry = data[i];\n    item = {};\n    item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n    parsed.push(parseValue(entry, item, vScale, i));\n  }\n  return parsed;\n}\nfunction isFloatBar(custom) {\n  return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n  if (size !== 0) {\n    return sign(size);\n  }\n  return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n  let reverse, start, end, top, bottom;\n  if (properties.horizontal) {\n    reverse = properties.base > properties.x;\n    start = 'left';\n    end = 'right';\n  } else {\n    reverse = properties.base < properties.y;\n    start = 'bottom';\n    end = 'top';\n  }\n  if (reverse) {\n    top = 'end';\n    bottom = 'start';\n  } else {\n    top = 'start';\n    bottom = 'end';\n  }\n  return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n  let edge = options.borderSkipped;\n  const res = {};\n  if (!edge) {\n    properties.borderSkipped = res;\n    return;\n  }\n  const {start, end, reverse, top, bottom} = borderProps(properties);\n  if (edge === 'middle' && stack) {\n    properties.enableBorderRadius = true;\n    if ((stack._top || 0) === index) {\n      edge = top;\n    } else if ((stack._bottom || 0) === index) {\n      edge = bottom;\n    } else {\n      res[parseEdge(bottom, start, end, reverse)] = true;\n      edge = top;\n    }\n  }\n  res[parseEdge(edge, start, end, reverse)] = true;\n  properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n  if (reverse) {\n    edge = swap(edge, a, b);\n    edge = startEnd(edge, b, a);\n  } else {\n    edge = startEnd(edge, a, b);\n  }\n  return edge;\n}\nfunction swap(orig, v1, v2) {\n  return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n  return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n  properties.inflateAmount = inflateAmount === 'auto'\n    ? ratio === 1 ? 0.33 : 0\n    : inflateAmount;\n}\nclass BarController extends DatasetController {\n  parsePrimitiveData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseArrayData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseObjectData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const parsed = [];\n    let i, ilen, item, obj;\n    for (i = start, ilen = start + count; i < ilen; ++i) {\n      obj = data[i];\n      item = {};\n      item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n      parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n    }\n    return parsed;\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    super.updateRangeFromParsed(range, scale, parsed, stack);\n    const custom = parsed._custom;\n    if (custom && scale === this._cachedMeta.vScale) {\n      range.min = Math.min(range.min, custom.min);\n      range.max = Math.max(range.max, custom.max);\n    }\n  }\n  getMaxOverflow() {\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {iScale, vScale} = meta;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const value = isFloatBar(custom)\n      ? '[' + custom.start + ', ' + custom.end + ']'\n      : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n    return {\n      label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n      value\n    };\n  }\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n    const meta = this._cachedMeta;\n    meta.stack = this.getDataset().stack;\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    this.updateElements(meta.data, 0, meta.data.length, mode);\n  }\n  updateElements(bars, start, count, mode) {\n    const reset = mode === 'reset';\n    const {index, _cachedMeta: {vScale}} = this;\n    const base = vScale.getBasePixel();\n    const horizontal = vScale.isHorizontal();\n    const ruler = this._getRuler();\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    for (let i = start; i < start + count; i++) {\n      const parsed = this.getParsed(i);\n      const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n      const ipixels = this._calculateBarIndexPixels(i, ruler);\n      const stack = (parsed._stacks || {})[vScale.axis];\n      const properties = {\n        horizontal,\n        base: vpixels.base,\n        enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n        x: horizontal ? vpixels.head : ipixels.center,\n        y: horizontal ? ipixels.center : vpixels.head,\n        height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n        width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n      }\n      const options = properties.options || bars[i].options;\n      setBorderSkipped(properties, options, stack, index);\n      setInflateAmount(properties, options, ruler.ratio);\n      this.updateElement(bars[i], i, properties, mode);\n    }\n  }\n  _getStacks(last, dataIndex) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const metasets = iScale.getMatchingVisibleMetas(this._type);\n    const stacked = iScale.options.stacked;\n    const ilen = metasets.length;\n    const stacks = [];\n    let i, item;\n    for (i = 0; i < ilen; ++i) {\n      item = metasets[i];\n      if (!item.controller.options.grouped) {\n        continue;\n      }\n      if (typeof dataIndex !== 'undefined') {\n        const val = item.controller.getParsed(dataIndex)[\n          item.controller._cachedMeta.vScale.axis\n        ];\n        if (isNullOrUndef(val) || isNaN(val)) {\n          continue;\n        }\n      }\n      if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n        stacks.push(item.stack);\n      }\n      if (item.index === last) {\n        break;\n      }\n    }\n    if (!stacks.length) {\n      stacks.push(undefined);\n    }\n    return stacks;\n  }\n  _getStackCount(index) {\n    return this._getStacks(undefined, index).length;\n  }\n  _getStackIndex(datasetIndex, name, dataIndex) {\n    const stacks = this._getStacks(datasetIndex, dataIndex);\n    const index = (name !== undefined)\n      ? stacks.indexOf(name)\n      : -1;\n    return (index === -1)\n      ? stacks.length - 1\n      : index;\n  }\n  _getRuler() {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const pixels = [];\n    let i, ilen;\n    for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n      pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n    }\n    const barThickness = opts.barThickness;\n    const min = barThickness || computeMinSampleSize(meta);\n    return {\n      min,\n      pixels,\n      start: iScale._startPixel,\n      end: iScale._endPixel,\n      stackCount: this._getStackCount(),\n      scale: iScale,\n      grouped: opts.grouped,\n      ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n    };\n  }\n  _calculateBarValuePixels(index) {\n    const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = this;\n    const actualBase = baseValue || 0;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const floating = isFloatBar(custom);\n    let value = parsed[vScale.axis];\n    let start = 0;\n    let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n    let head, size;\n    if (length !== value) {\n      start = length - value;\n      length = value;\n    }\n    if (floating) {\n      value = custom.barStart;\n      length = custom.barEnd - custom.barStart;\n      if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n        start = 0;\n      }\n      start += value;\n    }\n    const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n    let base = vScale.getPixelForValue(startValue);\n    if (this.chart.getDataVisibility(index)) {\n      head = vScale.getPixelForValue(start + length);\n    } else {\n      head = base;\n    }\n    size = head - base;\n    if (Math.abs(size) < minBarLength) {\n      size = barSign(size, vScale, actualBase) * minBarLength;\n      if (value === actualBase) {\n        base -= size / 2;\n      }\n      head = base + size;\n    }\n    if (base === vScale.getPixelForValue(actualBase)) {\n      const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n      base += halfGrid;\n      size -= halfGrid;\n    }\n    return {\n      size,\n      base,\n      head,\n      center: head + size / 2\n    };\n  }\n  _calculateBarIndexPixels(index, ruler) {\n    const scale = ruler.scale;\n    const options = this.options;\n    const skipNull = options.skipNull;\n    const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n    let center, size;\n    if (ruler.grouped) {\n      const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n      const range = options.barThickness === 'flex'\n        ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n        : computeFitCategoryTraits(index, ruler, options, stackCount);\n      const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n      center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n      size = Math.min(maxBarThickness, range.chunk * range.ratio);\n    } else {\n      center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n      size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n    }\n    return {\n      base: center - size / 2,\n      head: center + size / 2,\n      center,\n      size\n    };\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    const vScale = meta.vScale;\n    const rects = meta.data;\n    const ilen = rects.length;\n    let i = 0;\n    for (; i < ilen; ++i) {\n      if (this.getParsed(i)[vScale.axis] !== null) {\n        rects[i].draw(this._ctx);\n      }\n    }\n  }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'bar',\n  categoryPercentage: 0.8,\n  barPercentage: 0.9,\n  grouped: true,\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'base', 'width', 'height']\n    }\n  }\n};\nBarController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n      offset: true,\n      grid: {\n        offset: true\n      }\n    },\n    _value_: {\n      type: 'linear',\n      beginAtZero: true,\n    }\n  }\n};\n\nclass BubbleController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const parsed = super.parsePrimitiveData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const parsed = super.parseArrayData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const parsed = super.parseObjectData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  getMaxOverflow() {\n    const data = this._cachedMeta.data;\n    let max = 0;\n    for (let i = data.length - 1; i >= 0; --i) {\n      max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n    }\n    return max > 0 && max;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {xScale, yScale} = meta;\n    const parsed = this.getParsed(index);\n    const x = xScale.getLabelForValue(parsed.x);\n    const y = yScale.getLabelForValue(parsed.y);\n    const r = parsed._custom;\n    return {\n      label: meta.label,\n      value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n    };\n  }\n  update(mode) {\n    const points = this._cachedMeta.data;\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const parsed = !reset && this.getParsed(i);\n      const properties = {};\n      const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n      const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel);\n      if (includeOptions) {\n        properties.options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n        if (reset) {\n          properties.options.radius = 0;\n        }\n      }\n      this.updateElement(point, i, properties, mode);\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  resolveDataElementOptions(index, mode) {\n    const parsed = this.getParsed(index);\n    let values = super.resolveDataElementOptions(index, mode);\n    if (values.$shared) {\n      values = Object.assign({}, values, {$shared: false});\n    }\n    const radius = values.radius;\n    if (mode !== 'active') {\n      values.radius = 0;\n    }\n    values.radius += valueOrDefault(parsed && parsed._custom, radius);\n    return values;\n  }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'point',\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'borderWidth', 'radius']\n    }\n  }\n};\nBubbleController.overrides = {\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        }\n      }\n    }\n  }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n  let ratioX = 1;\n  let ratioY = 1;\n  let offsetX = 0;\n  let offsetY = 0;\n  if (circumference < TAU) {\n    const startAngle = rotation;\n    const endAngle = startAngle + circumference;\n    const startX = Math.cos(startAngle);\n    const startY = Math.sin(startAngle);\n    const endX = Math.cos(endAngle);\n    const endY = Math.sin(endAngle);\n    const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n    const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n    const maxX = calcMax(0, startX, endX);\n    const maxY = calcMax(HALF_PI, startY, endY);\n    const minX = calcMin(PI, startX, endX);\n    const minY = calcMin(PI + HALF_PI, startY, endY);\n    ratioX = (maxX - minX) / 2;\n    ratioY = (maxY - minY) / 2;\n    offsetX = -(maxX + minX) / 2;\n    offsetY = -(maxY + minY) / 2;\n  }\n  return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.enableOptionSharing = true;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.offsetX = undefined;\n    this.offsetY = undefined;\n  }\n  linkScales() {}\n  parse(start, count) {\n    const data = this.getDataset().data;\n    const meta = this._cachedMeta;\n    if (this._parsing === false) {\n      meta._parsed = data;\n    } else {\n      let getter = (i) => +data[i];\n      if (isObject(data[start])) {\n        const {key = 'value'} = this._parsing;\n        getter = (i) => +resolveObjectKey(data[i], key);\n      }\n      let i, ilen;\n      for (i = start, ilen = start + count; i < ilen; ++i) {\n        meta._parsed[i] = getter(i);\n      }\n    }\n  }\n  _getRotation() {\n    return toRadians(this.options.rotation - 90);\n  }\n  _getCircumference() {\n    return toRadians(this.options.circumference);\n  }\n  _getRotationExtents() {\n    let min = TAU;\n    let max = -TAU;\n    for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        const controller = this.chart.getDatasetMeta(i).controller;\n        const rotation = controller._getRotation();\n        const circumference = controller._getCircumference();\n        min = Math.min(min, rotation);\n        max = Math.max(max, rotation + circumference);\n      }\n    }\n    return {\n      rotation: min,\n      circumference: max - min,\n    };\n  }\n  update(mode) {\n    const chart = this.chart;\n    const {chartArea} = chart;\n    const meta = this._cachedMeta;\n    const arcs = meta.data;\n    const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n    const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n    const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n    const chartWeight = this._getRingWeight(this.index);\n    const {circumference, rotation} = this._getRotationExtents();\n    const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n    const maxWidth = (chartArea.width - spacing) / ratioX;\n    const maxHeight = (chartArea.height - spacing) / ratioY;\n    const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n    const outerRadius = toDimension(this.options.radius, maxRadius);\n    const innerRadius = Math.max(outerRadius * cutout, 0);\n    const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n    this.offsetX = offsetX * outerRadius;\n    this.offsetY = offsetY * outerRadius;\n    meta.total = this.calculateTotal();\n    this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n    this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  _circumference(i, reset) {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const circumference = this._getCircumference();\n    if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n      return 0;\n    }\n    return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const centerX = (chartArea.left + chartArea.right) / 2;\n    const centerY = (chartArea.top + chartArea.bottom) / 2;\n    const animateScale = reset && animationOpts.animateScale;\n    const innerRadius = animateScale ? 0 : this.innerRadius;\n    const outerRadius = animateScale ? 0 : this.outerRadius;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    let startAngle = this._getRotation();\n    let i;\n    for (i = 0; i < start; ++i) {\n      startAngle += this._circumference(i, reset);\n    }\n    for (i = start; i < start + count; ++i) {\n      const circumference = this._circumference(i, reset);\n      const arc = arcs[i];\n      const properties = {\n        x: centerX + this.offsetX,\n        y: centerY + this.offsetY,\n        startAngle,\n        endAngle: startAngle + circumference,\n        circumference,\n        outerRadius,\n        innerRadius\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n      }\n      startAngle += circumference;\n      this.updateElement(arc, i, properties, mode);\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  calculateTotal() {\n    const meta = this._cachedMeta;\n    const metaData = meta.data;\n    let total = 0;\n    let i;\n    for (i = 0; i < metaData.length; i++) {\n      const value = meta._parsed[i];\n      if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n        total += Math.abs(value);\n      }\n    }\n    return total;\n  }\n  calculateCircumference(value) {\n    const total = this._cachedMeta.total;\n    if (total > 0 && !isNaN(value)) {\n      return TAU * (Math.abs(value) / total);\n    }\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index], chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  getMaxBorderWidth(arcs) {\n    let max = 0;\n    const chart = this.chart;\n    let i, ilen, meta, controller, options;\n    if (!arcs) {\n      for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          meta = chart.getDatasetMeta(i);\n          arcs = meta.data;\n          controller = meta.controller;\n          break;\n        }\n      }\n    }\n    if (!arcs) {\n      return 0;\n    }\n    for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n      options = controller.resolveDataElementOptions(i);\n      if (options.borderAlign !== 'inner') {\n        max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n      }\n    }\n    return max;\n  }\n  getMaxOffset(arcs) {\n    let max = 0;\n    for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n      const options = this.resolveDataElementOptions(i);\n      max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n    }\n    return max;\n  }\n  _getRingWeightOffset(datasetIndex) {\n    let ringWeightOffset = 0;\n    for (let i = 0; i < datasetIndex; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        ringWeightOffset += this._getRingWeight(i);\n      }\n    }\n    return ringWeightOffset;\n  }\n  _getRingWeight(datasetIndex) {\n    return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n  }\n  _getVisibleDatasetWeightTotal() {\n    return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n  }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: false\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n    },\n  },\n  cutout: '50%',\n  rotation: 0,\n  circumference: 360,\n  radius: '100%',\n  spacing: 0,\n  indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n  _scriptable: (name) => name !== 'spacing',\n  _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(tooltipItem) {\n          let dataLabel = tooltipItem.label;\n          const value = ': ' + tooltipItem.formattedValue;\n          if (isArray(dataLabel)) {\n            dataLabel = dataLabel.slice();\n            dataLabel[0] += value;\n          } else {\n            dataLabel += value;\n          }\n          return dataLabel;\n        }\n      }\n    }\n  }\n};\n\nclass LineController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {dataset: line, data: points = [], _dataset} = meta;\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n    this._drawStart = start;\n    this._drawCount = count;\n    if (scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n    line._chart = this.chart;\n    line._datasetIndex = this.index;\n    line._decimated = !!_dataset._decimated;\n    line.points = points;\n    const options = this.resolveDatasetElementOptions(mode);\n    if (!this.options.showLine) {\n      options.borderWidth = 0;\n    }\n    options.segment = this.options.segment;\n    this.updateElement(line, undefined, {\n      animated: !animationsDisabled,\n      options\n    }, mode);\n    this.updateElements(points, start, count, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n    for (let i = start; i < start + count; ++i) {\n      const point = points[i];\n      const parsed = this.getParsed(i);\n      const properties = directUpdate ? point : {};\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n      prevParsed = parsed;\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n    const data = meta.data || [];\n    if (!data.length) {\n      return border;\n    }\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n    super.draw();\n  }\n}\nLineController.id = 'line';\nLineController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  showLine: true,\n  spanGaps: false,\n};\nLineController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n    },\n    _value_: {\n      type: 'linear',\n    },\n  }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n  const pointCount = points.length;\n  let start = 0;\n  let count = pointCount;\n  if (meta._sorted) {\n    const {iScale, _parsed} = meta;\n    const axis = iScale.axis;\n    const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n    if (minDefined) {\n      start = _limitValue(Math.min(\n        _lookupByKey(_parsed, iScale.axis, min).lo,\n        animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n      0, pointCount - 1);\n    }\n    if (maxDefined) {\n      count = _limitValue(Math.max(\n        _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n      start, pointCount) - start;\n    } else {\n      count = pointCount - start;\n    }\n  }\n  return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n  const {xScale, yScale, _scaleRanges} = meta;\n  const newRanges = {\n    xmin: xScale.min,\n    xmax: xScale.max,\n    ymin: yScale.min,\n    ymax: yScale.max\n  };\n  if (!_scaleRanges) {\n    meta._scaleRanges = newRanges;\n    return true;\n  }\n  const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n  Object.assign(_scaleRanges, newRanges);\n  return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  update(mode) {\n    const arcs = this._cachedMeta.data;\n    this._updateRadius();\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  _updateRadius() {\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n    const outerRadius = Math.max(minSize / 2, 0);\n    const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n    const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n    this.outerRadius = outerRadius - (radiusLength * this.index);\n    this.innerRadius = this.outerRadius - radiusLength;\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const dataset = this.getDataset();\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const scale = this._cachedMeta.rScale;\n    const centerX = scale.xCenter;\n    const centerY = scale.yCenter;\n    const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n    let angle = datasetStartAngle;\n    let i;\n    const defaultAngle = 360 / this.countVisibleElements();\n    for (i = 0; i < start; ++i) {\n      angle += this._computeAngle(i, mode, defaultAngle);\n    }\n    for (i = start; i < start + count; i++) {\n      const arc = arcs[i];\n      let startAngle = angle;\n      let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n      let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n      angle = endAngle;\n      if (reset) {\n        if (animationOpts.animateScale) {\n          outerRadius = 0;\n        }\n        if (animationOpts.animateRotate) {\n          startAngle = endAngle = datasetStartAngle;\n        }\n      }\n      const properties = {\n        x: centerX,\n        y: centerY,\n        innerRadius: 0,\n        outerRadius,\n        startAngle,\n        endAngle,\n        options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n      };\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n  countVisibleElements() {\n    const dataset = this.getDataset();\n    const meta = this._cachedMeta;\n    let count = 0;\n    meta.data.forEach((element, index) => {\n      if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n        count++;\n      }\n    });\n    return count;\n  }\n  _computeAngle(index, mode, defaultAngle) {\n    return this.chart.getDataVisibility(index)\n      ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n      : 0;\n  }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: true\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n    },\n  },\n  indexAxis: 'r',\n  startAngle: 0,\n};\nPolarAreaController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(context) {\n          return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n        }\n      }\n    }\n  },\n  scales: {\n    r: {\n      type: 'radialLinear',\n      angleLines: {\n        display: false\n      },\n      beginAtZero: true,\n      grid: {\n        circular: true\n      },\n      pointLabels: {\n        display: false\n      },\n      startAngle: 0\n    }\n  }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n  cutout: 0,\n  rotation: 0,\n  circumference: 360,\n  radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n  getLabelAndValue(index) {\n    const vScale = this._cachedMeta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: vScale.getLabels()[index],\n      value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n    };\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const line = meta.dataset;\n    const points = meta.data || [];\n    const labels = meta.iScale.getLabels();\n    line.points = points;\n    if (mode !== 'resize') {\n      const options = this.resolveDatasetElementOptions(mode);\n      if (!this.options.showLine) {\n        options.borderWidth = 0;\n      }\n      const properties = {\n        _loop: true,\n        _fullLoop: labels.length === points.length,\n        options\n      };\n      this.updateElement(line, undefined, properties, mode);\n    }\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const dataset = this.getDataset();\n    const scale = this._cachedMeta.rScale;\n    const reset = mode === 'reset';\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n      const x = reset ? scale.xCenter : pointPosition.x;\n      const y = reset ? scale.yCenter : pointPosition.y;\n      const properties = {\n        x,\n        y,\n        angle: pointPosition.angle,\n        skip: isNaN(x) || isNaN(y),\n        options\n      };\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  indexAxis: 'r',\n  showLine: true,\n  elements: {\n    line: {\n      fill: 'start'\n    }\n  },\n};\nRadarController.overrides = {\n  aspectRatio: 1,\n  scales: {\n    r: {\n      type: 'radialLinear',\n    }\n  }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n  showLine: false,\n  fill: false\n};\nScatterController.overrides = {\n  interaction: {\n    mode: 'point'\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(item) {\n          return '(' + item.label + ', ' + item.formattedValue + ')';\n        }\n      }\n    }\n  },\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction abstract() {\n  throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n  constructor(options) {\n    this.options = options || {};\n  }\n  formats() {\n    return abstract();\n  }\n  parse(value, format) {\n    return abstract();\n  }\n  format(timestamp, format) {\n    return abstract();\n  }\n  add(timestamp, amount, unit) {\n    return abstract();\n  }\n  diff(a, b, unit) {\n    return abstract();\n  }\n  startOf(timestamp, unit, weekday) {\n    return abstract();\n  }\n  endOf(timestamp, unit) {\n    return abstract();\n  }\n}\nDateAdapter.override = function(members) {\n  Object.assign(DateAdapter.prototype, members);\n};\nvar adapters = {\n  _date: DateAdapter\n};\n\nfunction getRelativePosition(e, chart) {\n  if ('native' in e) {\n    return {\n      x: e.x,\n      y: e.y\n    };\n  }\n  return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  let index, data, element;\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    ({index, data} = metasets[i]);\n    for (let j = 0, jlen = data.length; j < jlen; ++j) {\n      element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n  const {controller, data, _sorted} = metaset;\n  const iScale = controller._cachedMeta.iScale;\n  if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n    const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n    if (!intersect) {\n      return lookupMethod(data, axis, value);\n    } else if (controller._sharedOptions) {\n      const el = data[0];\n      const range = typeof el.getRange === 'function' && el.getRange(axis);\n      if (range) {\n        const start = lookupMethod(data, axis, value - range);\n        const end = lookupMethod(data, axis, value + range);\n        return {lo: start.lo, hi: end.hi};\n      }\n    }\n  }\n  return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  const value = position[axis];\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    const {index, data} = metasets[i];\n    const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n    for (let j = lo; j <= hi; ++j) {\n      const element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\nfunction getDistanceMetricForAxis(axis) {\n  const useX = axis.indexOf('x') !== -1;\n  const useY = axis.indexOf('y') !== -1;\n  return function(pt1, pt2) {\n    const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n    const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n    return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n  };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n  const items = [];\n  if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n    return items;\n  }\n  const evaluationFunc = function(element, datasetIndex, index) {\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n  };\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n  return items;\n}\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n  let items = [];\n  function evaluationFunc(element, datasetIndex, index) {\n    const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n    const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n    if (_angleBetween(angle, startAngle, endAngle)) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition) {\n  let items = [];\n  const distanceMetric = getDistanceMetricForAxis(axis);\n  let minDistance = Number.POSITIVE_INFINITY;\n  function evaluationFunc(element, datasetIndex, index) {\n    const inRange = element.inRange(position.x, position.y, useFinalPosition);\n    if (intersect && !inRange) {\n      return;\n    }\n    const center = element.getCenterPoint(useFinalPosition);\n    const pointInArea = _isPointInArea(center, chart.chartArea, chart._minPadding);\n    if (!pointInArea && !inRange) {\n      return;\n    }\n    const distance = distanceMetric(position, center);\n    if (distance < minDistance) {\n      items = [{element, datasetIndex, index}];\n      minDistance = distance;\n    } else if (distance === minDistance) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n  if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n    return [];\n  }\n  return axis === 'r' && !intersect\n    ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n    : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition);\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n  const position = getRelativePosition(e, chart);\n  const items = [];\n  const axis = options.axis;\n  const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n  let intersectsItem = false;\n  evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n    if (element[rangeMethod](position[axis], useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      intersectsItem = true;\n    }\n  });\n  if (options.intersect && !intersectsItem) {\n    return [];\n  }\n  return items;\n}\nvar Interaction = {\n  modes: {\n    index(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'x';\n      const items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition)\n        : getNearestItems(chart, position, axis, false, useFinalPosition);\n      const elements = [];\n      if (!items.length) {\n        return [];\n      }\n      chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n        const index = items[0].index;\n        const element = meta.data[index];\n        if (element && !element.skip) {\n          elements.push({element, datasetIndex: meta.index, index});\n        }\n      });\n      return elements;\n    },\n    dataset(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      let items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition) :\n        getNearestItems(chart, position, axis, false, useFinalPosition);\n      if (items.length > 0) {\n        const datasetIndex = items[0].datasetIndex;\n        const data = chart.getDatasetMeta(datasetIndex).data;\n        items = [];\n        for (let i = 0; i < data.length; ++i) {\n          items.push({element: data[i], datasetIndex, index: i});\n        }\n      }\n      return items;\n    },\n    point(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      return getIntersectItems(chart, position, axis, useFinalPosition);\n    },\n    nearest(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n    },\n    x(chart, e, options, useFinalPosition) {\n      return getAxisItems(chart, e, {axis: 'x', intersect: options.intersect}, useFinalPosition);\n    },\n    y(chart, e, options, useFinalPosition) {\n      return getAxisItems(chart, e, {axis: 'y', intersect: options.intersect}, useFinalPosition);\n    }\n  }\n};\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n  return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n  return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n  return array.sort((a, b) => {\n    const v0 = reverse ? b : a;\n    const v1 = reverse ? a : b;\n    return v0.weight === v1.weight ?\n      v0.index - v1.index :\n      v0.weight - v1.weight;\n  });\n}\nfunction wrapBoxes(boxes) {\n  const layoutBoxes = [];\n  let i, ilen, box, pos, stack, stackWeight;\n  for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n    box = boxes[i];\n    ({position: pos, options: {stack, stackWeight = 1}} = box);\n    layoutBoxes.push({\n      index: i,\n      box,\n      pos,\n      horizontal: box.isHorizontal(),\n      weight: box.weight,\n      stack: stack && (pos + stack),\n      stackWeight\n    });\n  }\n  return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n  const stacks = {};\n  for (const wrap of layouts) {\n    const {stack, pos, stackWeight} = wrap;\n    if (!stack || !STATIC_POSITIONS.includes(pos)) {\n      continue;\n    }\n    const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n    _stack.count++;\n    _stack.weight += stackWeight;\n  }\n  return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n  const stacks = buildStacks(layouts);\n  const {vBoxMaxWidth, hBoxMaxHeight} = params;\n  let i, ilen, layout;\n  for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n    layout = layouts[i];\n    const {fullSize} = layout.box;\n    const stack = stacks[layout.stack];\n    const factor = stack && layout.stackWeight / stack.weight;\n    if (layout.horizontal) {\n      layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n      layout.height = hBoxMaxHeight;\n    } else {\n      layout.width = vBoxMaxWidth;\n      layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n    }\n  }\n  return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n  const layoutBoxes = wrapBoxes(boxes);\n  const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n  const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n  const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n  const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n  const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n  const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n  const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n  return {\n    fullSize,\n    leftAndTop: left.concat(top),\n    rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n    chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n    vertical: left.concat(right).concat(centerVertical),\n    horizontal: top.concat(bottom).concat(centerHorizontal)\n  };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n  return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n  maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n  maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n  maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n  maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n  const {pos, box} = layout;\n  const maxPadding = chartArea.maxPadding;\n  if (!isObject(pos)) {\n    if (layout.size) {\n      chartArea[pos] -= layout.size;\n    }\n    const stack = stacks[layout.stack] || {size: 0, count: 1};\n    stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n    layout.size = stack.size / stack.count;\n    chartArea[pos] += layout.size;\n  }\n  if (box.getPadding) {\n    updateMaxPadding(maxPadding, box.getPadding());\n  }\n  const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n  const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n  const widthChanged = newWidth !== chartArea.w;\n  const heightChanged = newHeight !== chartArea.h;\n  chartArea.w = newWidth;\n  chartArea.h = newHeight;\n  return layout.horizontal\n    ? {same: widthChanged, other: heightChanged}\n    : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function updatePos(pos) {\n    const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n    chartArea[pos] += change;\n    return change;\n  }\n  chartArea.y += updatePos('top');\n  chartArea.x += updatePos('left');\n  updatePos('right');\n  updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function marginForPositions(positions) {\n    const margin = {left: 0, top: 0, right: 0, bottom: 0};\n    positions.forEach((pos) => {\n      margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n    });\n    return margin;\n  }\n  return horizontal\n    ? marginForPositions(['left', 'right'])\n    : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n  const refitBoxes = [];\n  let i, ilen, layout, box, refit, changed;\n  for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n    layout = boxes[i];\n    box = layout.box;\n    box.update(\n      layout.width || chartArea.w,\n      layout.height || chartArea.h,\n      getMargins(layout.horizontal, chartArea)\n    );\n    const {same, other} = updateDims(chartArea, params, layout, stacks);\n    refit |= same && refitBoxes.length;\n    changed = changed || other;\n    if (!box.fullSize) {\n      refitBoxes.push(layout);\n    }\n  }\n  return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n  box.top = top;\n  box.left = left;\n  box.right = left + width;\n  box.bottom = top + height;\n  box.width = width;\n  box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n  const userPadding = params.padding;\n  let {x, y} = chartArea;\n  for (const layout of boxes) {\n    const box = layout.box;\n    const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n    const weight = (layout.stackWeight / stack.weight) || 1;\n    if (layout.horizontal) {\n      const width = chartArea.w * weight;\n      const height = stack.size || box.height;\n      if (defined(stack.start)) {\n        y = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n      } else {\n        setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n      }\n      stack.start = y;\n      stack.placed += width;\n      y = box.bottom;\n    } else {\n      const height = chartArea.h * weight;\n      const width = stack.size || box.width;\n      if (defined(stack.start)) {\n        x = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n      } else {\n        setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n      }\n      stack.start = x;\n      stack.placed += height;\n      x = box.right;\n    }\n  }\n  chartArea.x = x;\n  chartArea.y = y;\n}\ndefaults.set('layout', {\n  autoPadding: true,\n  padding: {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  }\n});\nvar layouts = {\n  addBox(chart, item) {\n    if (!chart.boxes) {\n      chart.boxes = [];\n    }\n    item.fullSize = item.fullSize || false;\n    item.position = item.position || 'top';\n    item.weight = item.weight || 0;\n    item._layers = item._layers || function() {\n      return [{\n        z: 0,\n        draw(chartArea) {\n          item.draw(chartArea);\n        }\n      }];\n    };\n    chart.boxes.push(item);\n  },\n  removeBox(chart, layoutItem) {\n    const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n    if (index !== -1) {\n      chart.boxes.splice(index, 1);\n    }\n  },\n  configure(chart, item, options) {\n    item.fullSize = options.fullSize;\n    item.position = options.position;\n    item.weight = options.weight;\n  },\n  update(chart, width, height, minPadding) {\n    if (!chart) {\n      return;\n    }\n    const padding = toPadding(chart.options.layout.padding);\n    const availableWidth = Math.max(width - padding.width, 0);\n    const availableHeight = Math.max(height - padding.height, 0);\n    const boxes = buildLayoutBoxes(chart.boxes);\n    const verticalBoxes = boxes.vertical;\n    const horizontalBoxes = boxes.horizontal;\n    each(chart.boxes, box => {\n      if (typeof box.beforeLayout === 'function') {\n        box.beforeLayout();\n      }\n    });\n    const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n      wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n    const params = Object.freeze({\n      outerWidth: width,\n      outerHeight: height,\n      padding,\n      availableWidth,\n      availableHeight,\n      vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n      hBoxMaxHeight: availableHeight / 2\n    });\n    const maxPadding = Object.assign({}, padding);\n    updateMaxPadding(maxPadding, toPadding(minPadding));\n    const chartArea = Object.assign({\n      maxPadding,\n      w: availableWidth,\n      h: availableHeight,\n      x: padding.left,\n      y: padding.top\n    }, padding);\n    const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n    fitBoxes(boxes.fullSize, chartArea, params, stacks);\n    fitBoxes(verticalBoxes, chartArea, params, stacks);\n    if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n      fitBoxes(verticalBoxes, chartArea, params, stacks);\n    }\n    handleMaxPadding(chartArea);\n    placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n    chartArea.x += chartArea.w;\n    chartArea.y += chartArea.h;\n    placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n    chart.chartArea = {\n      left: chartArea.left,\n      top: chartArea.top,\n      right: chartArea.left + chartArea.w,\n      bottom: chartArea.top + chartArea.h,\n      height: chartArea.h,\n      width: chartArea.w,\n    };\n    each(boxes.chartArea, (layout) => {\n      const box = layout.box;\n      Object.assign(box, chart.chartArea);\n      box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n    });\n  }\n};\n\nclass BasePlatform {\n  acquireContext(canvas, aspectRatio) {}\n  releaseContext(context) {\n    return false;\n  }\n  addEventListener(chart, type, listener) {}\n  removeEventListener(chart, type, listener) {}\n  getDevicePixelRatio() {\n    return 1;\n  }\n  getMaximumSize(element, width, height, aspectRatio) {\n    width = Math.max(0, width || element.width);\n    height = height || element.height;\n    return {\n      width,\n      height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n    };\n  }\n  isAttached(canvas) {\n    return true;\n  }\n  updateConfig(config) {\n  }\n}\n\nclass BasicPlatform extends BasePlatform {\n  acquireContext(item) {\n    return item && item.getContext && item.getContext('2d') || null;\n  }\n  updateConfig(config) {\n    config.options.animation = false;\n  }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n  touchstart: 'mousedown',\n  touchmove: 'mousemove',\n  touchend: 'mouseup',\n  pointerenter: 'mouseenter',\n  pointerdown: 'mousedown',\n  pointermove: 'mousemove',\n  pointerup: 'mouseup',\n  pointerleave: 'mouseout',\n  pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n  const style = canvas.style;\n  const renderHeight = canvas.getAttribute('height');\n  const renderWidth = canvas.getAttribute('width');\n  canvas[EXPANDO_KEY] = {\n    initial: {\n      height: renderHeight,\n      width: renderWidth,\n      style: {\n        display: style.display,\n        height: style.height,\n        width: style.width\n      }\n    }\n  };\n  style.display = style.display || 'block';\n  style.boxSizing = style.boxSizing || 'border-box';\n  if (isNullOrEmpty(renderWidth)) {\n    const displayWidth = readUsedSize(canvas, 'width');\n    if (displayWidth !== undefined) {\n      canvas.width = displayWidth;\n    }\n  }\n  if (isNullOrEmpty(renderHeight)) {\n    if (canvas.style.height === '') {\n      canvas.height = canvas.width / (aspectRatio || 2);\n    } else {\n      const displayHeight = readUsedSize(canvas, 'height');\n      if (displayHeight !== undefined) {\n        canvas.height = displayHeight;\n      }\n    }\n  }\n  return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n  node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n  chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n  const type = EVENT_TYPES[event.type] || event.type;\n  const {x, y} = getRelativePosition$1(event, chart);\n  return {\n    type,\n    chart,\n    native: event,\n    x: x !== undefined ? x : null,\n    y: y !== undefined ? y : null,\n  };\n}\nfunction nodeListContains(nodeList, canvas) {\n  for (const node of nodeList) {\n    if (node === canvas || node.contains(canvas)) {\n      return true;\n    }\n  }\n}\nfunction createAttachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n  const dpr = window.devicePixelRatio;\n  if (dpr === oldDevicePixelRatio) {\n    return;\n  }\n  oldDevicePixelRatio = dpr;\n  drpListeningCharts.forEach((resize, chart) => {\n    if (chart.currentDevicePixelRatio !== dpr) {\n      resize();\n    }\n  });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n  if (!drpListeningCharts.size) {\n    window.addEventListener('resize', onWindowResize);\n  }\n  drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n  drpListeningCharts.delete(chart);\n  if (!drpListeningCharts.size) {\n    window.removeEventListener('resize', onWindowResize);\n  }\n}\nfunction createResizeObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const container = canvas && _getParentNode(canvas);\n  if (!container) {\n    return;\n  }\n  const resize = throttled((width, height) => {\n    const w = container.clientWidth;\n    listener(width, height);\n    if (w < container.clientWidth) {\n      listener();\n    }\n  }, window);\n  const observer = new ResizeObserver(entries => {\n    const entry = entries[0];\n    const width = entry.contentRect.width;\n    const height = entry.contentRect.height;\n    if (width === 0 && height === 0) {\n      return;\n    }\n    resize(width, height);\n  });\n  observer.observe(container);\n  listenDevicePixelRatioChanges(chart, resize);\n  return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n  if (observer) {\n    observer.disconnect();\n  }\n  if (type === 'resize') {\n    unlistenDevicePixelRatioChanges(chart);\n  }\n}\nfunction createProxyAndListen(chart, type, listener) {\n  const canvas = chart.canvas;\n  const proxy = throttled((event) => {\n    if (chart.ctx !== null) {\n      listener(fromNativeEvent(event, chart));\n    }\n  }, chart, (args) => {\n    const event = args[0];\n    return [event, event.offsetX, event.offsetY];\n  });\n  addListener(canvas, type, proxy);\n  return proxy;\n}\nclass DomPlatform extends BasePlatform {\n  acquireContext(canvas, aspectRatio) {\n    const context = canvas && canvas.getContext && canvas.getContext('2d');\n    if (context && context.canvas === canvas) {\n      initCanvas(canvas, aspectRatio);\n      return context;\n    }\n    return null;\n  }\n  releaseContext(context) {\n    const canvas = context.canvas;\n    if (!canvas[EXPANDO_KEY]) {\n      return false;\n    }\n    const initial = canvas[EXPANDO_KEY].initial;\n    ['height', 'width'].forEach((prop) => {\n      const value = initial[prop];\n      if (isNullOrUndef(value)) {\n        canvas.removeAttribute(prop);\n      } else {\n        canvas.setAttribute(prop, value);\n      }\n    });\n    const style = initial.style || {};\n    Object.keys(style).forEach((key) => {\n      canvas.style[key] = style[key];\n    });\n    canvas.width = canvas.width;\n    delete canvas[EXPANDO_KEY];\n    return true;\n  }\n  addEventListener(chart, type, listener) {\n    this.removeEventListener(chart, type);\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const handlers = {\n      attach: createAttachObserver,\n      detach: createDetachObserver,\n      resize: createResizeObserver\n    };\n    const handler = handlers[type] || createProxyAndListen;\n    proxies[type] = handler(chart, type, listener);\n  }\n  removeEventListener(chart, type) {\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const proxy = proxies[type];\n    if (!proxy) {\n      return;\n    }\n    const handlers = {\n      attach: releaseObserver,\n      detach: releaseObserver,\n      resize: releaseObserver\n    };\n    const handler = handlers[type] || removeListener;\n    handler(chart, type, proxy);\n    proxies[type] = undefined;\n  }\n  getDevicePixelRatio() {\n    return window.devicePixelRatio;\n  }\n  getMaximumSize(canvas, width, height, aspectRatio) {\n    return getMaximumSize(canvas, width, height, aspectRatio);\n  }\n  isAttached(canvas) {\n    const container = _getParentNode(canvas);\n    return !!(container && container.isConnected);\n  }\n}\n\nfunction _detectPlatform(canvas) {\n  if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n    return BasicPlatform;\n  }\n  return DomPlatform;\n}\n\nclass Element {\n  constructor() {\n    this.x = undefined;\n    this.y = undefined;\n    this.active = false;\n    this.options = undefined;\n    this.$animations = undefined;\n  }\n  tooltipPosition(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  hasValue() {\n    return isNumber(this.x) && isNumber(this.y);\n  }\n  getProps(props, final) {\n    const anims = this.$animations;\n    if (!final || !anims) {\n      return this;\n    }\n    const ret = {};\n    props.forEach(prop => {\n      ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n    });\n    return ret;\n  }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n  values(value) {\n    return isArray(value) ? value : '' + value;\n  },\n  numeric(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const locale = this.chart.options.locale;\n    let notation;\n    let delta = tickValue;\n    if (ticks.length > 1) {\n      const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n      if (maxTick < 1e-4 || maxTick > 1e+15) {\n        notation = 'scientific';\n      }\n      delta = calculateDelta(tickValue, ticks);\n    }\n    const logDelta = log10(Math.abs(delta));\n    const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n    const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n    Object.assign(options, this.options.ticks.format);\n    return formatNumber(tickValue, locale, options);\n  },\n  logarithmic(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n    if (remain === 1 || remain === 2 || remain === 5) {\n      return formatters.numeric.call(this, tickValue, index, ticks);\n    }\n    return '';\n  }\n};\nfunction calculateDelta(tickValue, ticks) {\n  let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n  if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n    delta = tickValue - Math.floor(tickValue);\n  }\n  return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n  display: true,\n  offset: false,\n  reverse: false,\n  beginAtZero: false,\n  bounds: 'ticks',\n  grace: 0,\n  grid: {\n    display: true,\n    lineWidth: 1,\n    drawBorder: true,\n    drawOnChartArea: true,\n    drawTicks: true,\n    tickLength: 8,\n    tickWidth: (_ctx, options) => options.lineWidth,\n    tickColor: (_ctx, options) => options.color,\n    offset: false,\n    borderDash: [],\n    borderDashOffset: 0.0,\n    borderWidth: 1\n  },\n  title: {\n    display: false,\n    text: '',\n    padding: {\n      top: 4,\n      bottom: 4\n    }\n  },\n  ticks: {\n    minRotation: 0,\n    maxRotation: 50,\n    mirror: false,\n    textStrokeWidth: 0,\n    textStrokeColor: '',\n    padding: 3,\n    display: true,\n    autoSkip: true,\n    autoSkipPadding: 3,\n    labelOffset: 0,\n    callback: Ticks.formatters.values,\n    minor: {},\n    major: {},\n    align: 'center',\n    crossAlign: 'near',\n    showLabelBackdrop: false,\n    backdropColor: 'rgba(255, 255, 255, 0.75)',\n    backdropPadding: 2,\n  }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n  _fallback: false,\n  _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n  _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n  _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n  _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n  _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n  const tickOpts = scale.options.ticks;\n  const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n  const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n  const numMajorIndices = majorIndices.length;\n  const first = majorIndices[0];\n  const last = majorIndices[numMajorIndices - 1];\n  const newTicks = [];\n  if (numMajorIndices > ticksLimit) {\n    skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n    return newTicks;\n  }\n  const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n  if (numMajorIndices > 0) {\n    let i, ilen;\n    const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n    skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n    for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n      skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n    }\n    skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n    return newTicks;\n  }\n  skip(ticks, newTicks, spacing);\n  return newTicks;\n}\nfunction determineMaxTicks(scale) {\n  const offset = scale.options.offset;\n  const tickLength = scale._tickSize();\n  const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n  const maxChart = scale._maxLength / tickLength;\n  return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n  const evenMajorSpacing = getEvenSpacing(majorIndices);\n  const spacing = ticks.length / ticksLimit;\n  if (!evenMajorSpacing) {\n    return Math.max(spacing, 1);\n  }\n  const factors = _factorize(evenMajorSpacing);\n  for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n    const factor = factors[i];\n    if (factor > spacing) {\n      return factor;\n    }\n  }\n  return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n  const result = [];\n  let i, ilen;\n  for (i = 0, ilen = ticks.length; i < ilen; i++) {\n    if (ticks[i].major) {\n      result.push(i);\n    }\n  }\n  return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n  let count = 0;\n  let next = majorIndices[0];\n  let i;\n  spacing = Math.ceil(spacing);\n  for (i = 0; i < ticks.length; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = majorIndices[count * spacing];\n    }\n  }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n  const start = valueOrDefault(majorStart, 0);\n  const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n  let count = 0;\n  let length, i, next;\n  spacing = Math.ceil(spacing);\n  if (majorEnd) {\n    length = majorEnd - majorStart;\n    spacing = length / Math.floor(length / spacing);\n  }\n  next = start;\n  while (next < 0) {\n    count++;\n    next = Math.round(start + count * spacing);\n  }\n  for (i = Math.max(start, 0); i < end; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = Math.round(start + count * spacing);\n    }\n  }\n}\nfunction getEvenSpacing(arr) {\n  const len = arr.length;\n  let i, diff;\n  if (len < 2) {\n    return false;\n  }\n  for (diff = arr[0], i = 1; i < len; ++i) {\n    if (arr[i] - arr[i - 1] !== diff) {\n      return false;\n    }\n  }\n  return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n  const result = [];\n  const increment = arr.length / numItems;\n  const len = arr.length;\n  let i = 0;\n  for (; i < len; i += increment) {\n    result.push(arr[Math.floor(i)]);\n  }\n  return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n  const length = scale.ticks.length;\n  const validIndex = Math.min(index, length - 1);\n  const start = scale._startPixel;\n  const end = scale._endPixel;\n  const epsilon = 1e-6;\n  let lineValue = scale.getPixelForTick(validIndex);\n  let offset;\n  if (offsetGridLines) {\n    if (length === 1) {\n      offset = Math.max(lineValue - start, end - lineValue);\n    } else if (index === 0) {\n      offset = (scale.getPixelForTick(1) - lineValue) / 2;\n    } else {\n      offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n    }\n    lineValue += validIndex < index ? offset : -offset;\n    if (lineValue < start - epsilon || lineValue > end + epsilon) {\n      return;\n    }\n  }\n  return lineValue;\n}\nfunction garbageCollect(caches, length) {\n  each(caches, (cache) => {\n    const gc = cache.gc;\n    const gcLen = gc.length / 2;\n    let i;\n    if (gcLen > length) {\n      for (i = 0; i < gcLen; ++i) {\n        delete cache.data[gc[i]];\n      }\n      gc.splice(0, gcLen);\n    }\n  });\n}\nfunction getTickMarkLength(options) {\n  return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n  if (!options.display) {\n    return 0;\n  }\n  const font = toFont(options.font, fallback);\n  const padding = toPadding(options.padding);\n  const lines = isArray(options.text) ? options.text.length : 1;\n  return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n  return createContext(parent, {\n    scale,\n    type: 'scale'\n  });\n}\nfunction createTickContext(parent, index, tick) {\n  return createContext(parent, {\n    tick,\n    index,\n    type: 'tick'\n  });\n}\nfunction titleAlign(align, position, reverse) {\n  let ret = _toLeftRightCenter(align);\n  if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n    ret = reverseAlign(ret);\n  }\n  return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n  const {top, left, bottom, right, chart} = scale;\n  const {chartArea, scales} = chart;\n  let rotation = 0;\n  let maxWidth, titleX, titleY;\n  const height = bottom - top;\n  const width = right - left;\n  if (scale.isHorizontal()) {\n    titleX = _alignStartEnd(align, left, right);\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n    } else if (position === 'center') {\n      titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n    } else {\n      titleY = offsetFromEdge(scale, position, offset);\n    }\n    maxWidth = right - left;\n  } else {\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n    } else if (position === 'center') {\n      titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n    } else {\n      titleX = offsetFromEdge(scale, position, offset);\n    }\n    titleY = _alignStartEnd(align, bottom, top);\n    rotation = position === 'left' ? -HALF_PI : HALF_PI;\n  }\n  return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n  constructor(cfg) {\n    super();\n    this.id = cfg.id;\n    this.type = cfg.type;\n    this.options = undefined;\n    this.ctx = cfg.ctx;\n    this.chart = cfg.chart;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this._margins = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    this.maxWidth = undefined;\n    this.maxHeight = undefined;\n    this.paddingTop = undefined;\n    this.paddingBottom = undefined;\n    this.paddingLeft = undefined;\n    this.paddingRight = undefined;\n    this.axis = undefined;\n    this.labelRotation = undefined;\n    this.min = undefined;\n    this.max = undefined;\n    this._range = undefined;\n    this.ticks = [];\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this._labelSizes = null;\n    this._length = 0;\n    this._maxLength = 0;\n    this._longestTextCache = {};\n    this._startPixel = undefined;\n    this._endPixel = undefined;\n    this._reversePixels = false;\n    this._userMax = undefined;\n    this._userMin = undefined;\n    this._suggestedMax = undefined;\n    this._suggestedMin = undefined;\n    this._ticksLength = 0;\n    this._borderValue = 0;\n    this._cache = {};\n    this._dataLimitsCached = false;\n    this.$context = undefined;\n  }\n  init(options) {\n    this.options = options.setContext(this.getContext());\n    this.axis = options.axis;\n    this._userMin = this.parse(options.min);\n    this._userMax = this.parse(options.max);\n    this._suggestedMin = this.parse(options.suggestedMin);\n    this._suggestedMax = this.parse(options.suggestedMax);\n  }\n  parse(raw, index) {\n    return raw;\n  }\n  getUserBounds() {\n    let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n    _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n    _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n    _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n    _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n    return {\n      min: finiteOrDefault(_userMin, _suggestedMin),\n      max: finiteOrDefault(_userMax, _suggestedMax),\n      minDefined: isNumberFinite(_userMin),\n      maxDefined: isNumberFinite(_userMax)\n    };\n  }\n  getMinMax(canStack) {\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    let range;\n    if (minDefined && maxDefined) {\n      return {min, max};\n    }\n    const metas = this.getMatchingVisibleMetas();\n    for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n      range = metas[i].controller.getMinMax(this, canStack);\n      if (!minDefined) {\n        min = Math.min(min, range.min);\n      }\n      if (!maxDefined) {\n        max = Math.max(max, range.max);\n      }\n    }\n    min = maxDefined && min > max ? max : min;\n    max = minDefined && min > max ? min : max;\n    return {\n      min: finiteOrDefault(min, finiteOrDefault(max, min)),\n      max: finiteOrDefault(max, finiteOrDefault(min, max))\n    };\n  }\n  getPadding() {\n    return {\n      left: this.paddingLeft || 0,\n      top: this.paddingTop || 0,\n      right: this.paddingRight || 0,\n      bottom: this.paddingBottom || 0\n    };\n  }\n  getTicks() {\n    return this.ticks;\n  }\n  getLabels() {\n    const data = this.chart.data;\n    return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n  }\n  beforeLayout() {\n    this._cache = {};\n    this._dataLimitsCached = false;\n  }\n  beforeUpdate() {\n    callback(this.options.beforeUpdate, [this]);\n  }\n  update(maxWidth, maxHeight, margins) {\n    const {beginAtZero, grace, ticks: tickOpts} = this.options;\n    const sampleSize = tickOpts.sampleSize;\n    this.beforeUpdate();\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins = Object.assign({\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    }, margins);\n    this.ticks = null;\n    this._labelSizes = null;\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this.beforeSetDimensions();\n    this.setDimensions();\n    this.afterSetDimensions();\n    this._maxLength = this.isHorizontal()\n      ? this.width + margins.left + margins.right\n      : this.height + margins.top + margins.bottom;\n    if (!this._dataLimitsCached) {\n      this.beforeDataLimits();\n      this.determineDataLimits();\n      this.afterDataLimits();\n      this._range = _addGrace(this, grace, beginAtZero);\n      this._dataLimitsCached = true;\n    }\n    this.beforeBuildTicks();\n    this.ticks = this.buildTicks() || [];\n    this.afterBuildTicks();\n    const samplingEnabled = sampleSize < this.ticks.length;\n    this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n    this.configure();\n    this.beforeCalculateLabelRotation();\n    this.calculateLabelRotation();\n    this.afterCalculateLabelRotation();\n    if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n      this.ticks = autoSkip(this, this.ticks);\n      this._labelSizes = null;\n    }\n    if (samplingEnabled) {\n      this._convertTicksToLabels(this.ticks);\n    }\n    this.beforeFit();\n    this.fit();\n    this.afterFit();\n    this.afterUpdate();\n  }\n  configure() {\n    let reversePixels = this.options.reverse;\n    let startPixel, endPixel;\n    if (this.isHorizontal()) {\n      startPixel = this.left;\n      endPixel = this.right;\n    } else {\n      startPixel = this.top;\n      endPixel = this.bottom;\n      reversePixels = !reversePixels;\n    }\n    this._startPixel = startPixel;\n    this._endPixel = endPixel;\n    this._reversePixels = reversePixels;\n    this._length = endPixel - startPixel;\n    this._alignToPixels = this.options.alignToPixels;\n  }\n  afterUpdate() {\n    callback(this.options.afterUpdate, [this]);\n  }\n  beforeSetDimensions() {\n    callback(this.options.beforeSetDimensions, [this]);\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = 0;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = 0;\n      this.bottom = this.height;\n    }\n    this.paddingLeft = 0;\n    this.paddingTop = 0;\n    this.paddingRight = 0;\n    this.paddingBottom = 0;\n  }\n  afterSetDimensions() {\n    callback(this.options.afterSetDimensions, [this]);\n  }\n  _callHooks(name) {\n    this.chart.notifyPlugins(name, this.getContext());\n    callback(this.options[name], [this]);\n  }\n  beforeDataLimits() {\n    this._callHooks('beforeDataLimits');\n  }\n  determineDataLimits() {}\n  afterDataLimits() {\n    this._callHooks('afterDataLimits');\n  }\n  beforeBuildTicks() {\n    this._callHooks('beforeBuildTicks');\n  }\n  buildTicks() {\n    return [];\n  }\n  afterBuildTicks() {\n    this._callHooks('afterBuildTicks');\n  }\n  beforeTickToLabelConversion() {\n    callback(this.options.beforeTickToLabelConversion, [this]);\n  }\n  generateTickLabels(ticks) {\n    const tickOpts = this.options.ticks;\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      tick = ticks[i];\n      tick.label = callback(tickOpts.callback, [tick.value, i, ticks], this);\n    }\n  }\n  afterTickToLabelConversion() {\n    callback(this.options.afterTickToLabelConversion, [this]);\n  }\n  beforeCalculateLabelRotation() {\n    callback(this.options.beforeCalculateLabelRotation, [this]);\n  }\n  calculateLabelRotation() {\n    const options = this.options;\n    const tickOpts = options.ticks;\n    const numTicks = this.ticks.length;\n    const minRotation = tickOpts.minRotation || 0;\n    const maxRotation = tickOpts.maxRotation;\n    let labelRotation = minRotation;\n    let tickWidth, maxHeight, maxLabelDiagonal;\n    if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n      this.labelRotation = minRotation;\n      return;\n    }\n    const labelSizes = this._getLabelSizes();\n    const maxLabelWidth = labelSizes.widest.width;\n    const maxLabelHeight = labelSizes.highest.height;\n    const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n    tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n    if (maxLabelWidth + 6 > tickWidth) {\n      tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n      maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n      maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n      labelRotation = toDegrees(Math.min(\n        Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n        Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n      ));\n      labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n    }\n    this.labelRotation = labelRotation;\n  }\n  afterCalculateLabelRotation() {\n    callback(this.options.afterCalculateLabelRotation, [this]);\n  }\n  beforeFit() {\n    callback(this.options.beforeFit, [this]);\n  }\n  fit() {\n    const minSize = {\n      width: 0,\n      height: 0\n    };\n    const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n    const display = this._isVisible();\n    const isHorizontal = this.isHorizontal();\n    if (display) {\n      const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n      if (isHorizontal) {\n        minSize.width = this.maxWidth;\n        minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n      } else {\n        minSize.height = this.maxHeight;\n        minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n      }\n      if (tickOpts.display && this.ticks.length) {\n        const {first, last, widest, highest} = this._getLabelSizes();\n        const tickPadding = tickOpts.padding * 2;\n        const angleRadians = toRadians(this.labelRotation);\n        const cos = Math.cos(angleRadians);\n        const sin = Math.sin(angleRadians);\n        if (isHorizontal) {\n          const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n          minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n        } else {\n          const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n          minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n        }\n        this._calculatePadding(first, last, sin, cos);\n      }\n    }\n    this._handleMargins();\n    if (isHorizontal) {\n      this.width = this._length = chart.width - this._margins.left - this._margins.right;\n      this.height = minSize.height;\n    } else {\n      this.width = minSize.width;\n      this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n    }\n  }\n  _calculatePadding(first, last, sin, cos) {\n    const {ticks: {align, padding}, position} = this.options;\n    const isRotated = this.labelRotation !== 0;\n    const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n    if (this.isHorizontal()) {\n      const offsetLeft = this.getPixelForTick(0) - this.left;\n      const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n      let paddingLeft = 0;\n      let paddingRight = 0;\n      if (isRotated) {\n        if (labelsBelowTicks) {\n          paddingLeft = cos * first.width;\n          paddingRight = sin * last.height;\n        } else {\n          paddingLeft = sin * first.height;\n          paddingRight = cos * last.width;\n        }\n      } else if (align === 'start') {\n        paddingRight = last.width;\n      } else if (align === 'end') {\n        paddingLeft = first.width;\n      } else {\n        paddingLeft = first.width / 2;\n        paddingRight = last.width / 2;\n      }\n      this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n      this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n    } else {\n      let paddingTop = last.height / 2;\n      let paddingBottom = first.height / 2;\n      if (align === 'start') {\n        paddingTop = 0;\n        paddingBottom = first.height;\n      } else if (align === 'end') {\n        paddingTop = last.height;\n        paddingBottom = 0;\n      }\n      this.paddingTop = paddingTop + padding;\n      this.paddingBottom = paddingBottom + padding;\n    }\n  }\n  _handleMargins() {\n    if (this._margins) {\n      this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n      this._margins.top = Math.max(this.paddingTop, this._margins.top);\n      this._margins.right = Math.max(this.paddingRight, this._margins.right);\n      this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n    }\n  }\n  afterFit() {\n    callback(this.options.afterFit, [this]);\n  }\n  isHorizontal() {\n    const {axis, position} = this.options;\n    return position === 'top' || position === 'bottom' || axis === 'x';\n  }\n  isFullSize() {\n    return this.options.fullSize;\n  }\n  _convertTicksToLabels(ticks) {\n    this.beforeTickToLabelConversion();\n    this.generateTickLabels(ticks);\n    let i, ilen;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      if (isNullOrUndef(ticks[i].label)) {\n        ticks.splice(i, 1);\n        ilen--;\n        i--;\n      }\n    }\n    this.afterTickToLabelConversion();\n  }\n  _getLabelSizes() {\n    let labelSizes = this._labelSizes;\n    if (!labelSizes) {\n      const sampleSize = this.options.ticks.sampleSize;\n      let ticks = this.ticks;\n      if (sampleSize < ticks.length) {\n        ticks = sample(ticks, sampleSize);\n      }\n      this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length);\n    }\n    return labelSizes;\n  }\n  _computeLabelSizes(ticks, length) {\n    const {ctx, _longestTextCache: caches} = this;\n    const widths = [];\n    const heights = [];\n    let widestLabelSize = 0;\n    let highestLabelSize = 0;\n    let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n    for (i = 0; i < length; ++i) {\n      label = ticks[i].label;\n      tickFont = this._resolveTickFontOptions(i);\n      ctx.font = fontString = tickFont.string;\n      cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n      lineHeight = tickFont.lineHeight;\n      width = height = 0;\n      if (!isNullOrUndef(label) && !isArray(label)) {\n        width = _measureText(ctx, cache.data, cache.gc, width, label);\n        height = lineHeight;\n      } else if (isArray(label)) {\n        for (j = 0, jlen = label.length; j < jlen; ++j) {\n          nestedLabel = label[j];\n          if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n            width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n            height += lineHeight;\n          }\n        }\n      }\n      widths.push(width);\n      heights.push(height);\n      widestLabelSize = Math.max(width, widestLabelSize);\n      highestLabelSize = Math.max(height, highestLabelSize);\n    }\n    garbageCollect(caches, length);\n    const widest = widths.indexOf(widestLabelSize);\n    const highest = heights.indexOf(highestLabelSize);\n    const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n    return {\n      first: valueAt(0),\n      last: valueAt(length - 1),\n      widest: valueAt(widest),\n      highest: valueAt(highest),\n      widths,\n      heights,\n    };\n  }\n  getLabelForValue(value) {\n    return value;\n  }\n  getPixelForValue(value, index) {\n    return NaN;\n  }\n  getValueForPixel(pixel) {}\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getPixelForDecimal(decimal) {\n    if (this._reversePixels) {\n      decimal = 1 - decimal;\n    }\n    const pixel = this._startPixel + decimal * this._length;\n    return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n  }\n  getDecimalForPixel(pixel) {\n    const decimal = (pixel - this._startPixel) / this._length;\n    return this._reversePixels ? 1 - decimal : decimal;\n  }\n  getBasePixel() {\n    return this.getPixelForValue(this.getBaseValue());\n  }\n  getBaseValue() {\n    const {min, max} = this;\n    return min < 0 && max < 0 ? max :\n      min > 0 && max > 0 ? min :\n      0;\n  }\n  getContext(index) {\n    const ticks = this.ticks || [];\n    if (index >= 0 && index < ticks.length) {\n      const tick = ticks[index];\n      return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n    }\n    return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n  }\n  _tickSize() {\n    const optionTicks = this.options.ticks;\n    const rot = toRadians(this.labelRotation);\n    const cos = Math.abs(Math.cos(rot));\n    const sin = Math.abs(Math.sin(rot));\n    const labelSizes = this._getLabelSizes();\n    const padding = optionTicks.autoSkipPadding || 0;\n    const w = labelSizes ? labelSizes.widest.width + padding : 0;\n    const h = labelSizes ? labelSizes.highest.height + padding : 0;\n    return this.isHorizontal()\n      ? h * cos > w * sin ? w / cos : h / sin\n      : h * sin < w * cos ? h / cos : w / sin;\n  }\n  _isVisible() {\n    const display = this.options.display;\n    if (display !== 'auto') {\n      return !!display;\n    }\n    return this.getMatchingVisibleMetas().length > 0;\n  }\n  _computeGridLineItems(chartArea) {\n    const axis = this.axis;\n    const chart = this.chart;\n    const options = this.options;\n    const {grid, position} = options;\n    const offset = grid.offset;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const ticksLength = ticks.length + (offset ? 1 : 0);\n    const tl = getTickMarkLength(grid);\n    const items = [];\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n    const axisHalfWidth = axisWidth / 2;\n    const alignBorderValue = function(pixel) {\n      return _alignPixel(chart, pixel, axisWidth);\n    };\n    let borderValue, i, lineValue, alignedLineValue;\n    let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n    if (position === 'top') {\n      borderValue = alignBorderValue(this.bottom);\n      ty1 = this.bottom - tl;\n      ty2 = borderValue - axisHalfWidth;\n      y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n      y2 = chartArea.bottom;\n    } else if (position === 'bottom') {\n      borderValue = alignBorderValue(this.top);\n      y1 = chartArea.top;\n      y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = this.top + tl;\n    } else if (position === 'left') {\n      borderValue = alignBorderValue(this.right);\n      tx1 = this.right - tl;\n      tx2 = borderValue - axisHalfWidth;\n      x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n      x2 = chartArea.right;\n    } else if (position === 'right') {\n      borderValue = alignBorderValue(this.left);\n      x1 = chartArea.left;\n      x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n      tx1 = borderValue + axisHalfWidth;\n      tx2 = this.left + tl;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      y1 = chartArea.top;\n      y2 = chartArea.bottom;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = ty1 + tl;\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      tx1 = borderValue - axisHalfWidth;\n      tx2 = tx1 - tl;\n      x1 = chartArea.left;\n      x2 = chartArea.right;\n    }\n    const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n    const step = Math.max(1, Math.ceil(ticksLength / limit));\n    for (i = 0; i < ticksLength; i += step) {\n      const optsAtIndex = grid.setContext(this.getContext(i));\n      const lineWidth = optsAtIndex.lineWidth;\n      const lineColor = optsAtIndex.color;\n      const borderDash = grid.borderDash || [];\n      const borderDashOffset = optsAtIndex.borderDashOffset;\n      const tickWidth = optsAtIndex.tickWidth;\n      const tickColor = optsAtIndex.tickColor;\n      const tickBorderDash = optsAtIndex.tickBorderDash || [];\n      const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n      lineValue = getPixelForGridLine(this, i, offset);\n      if (lineValue === undefined) {\n        continue;\n      }\n      alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n      if (isHorizontal) {\n        tx1 = tx2 = x1 = x2 = alignedLineValue;\n      } else {\n        ty1 = ty2 = y1 = y2 = alignedLineValue;\n      }\n      items.push({\n        tx1,\n        ty1,\n        tx2,\n        ty2,\n        x1,\n        y1,\n        x2,\n        y2,\n        width: lineWidth,\n        color: lineColor,\n        borderDash,\n        borderDashOffset,\n        tickWidth,\n        tickColor,\n        tickBorderDash,\n        tickBorderDashOffset,\n      });\n    }\n    this._ticksLength = ticksLength;\n    this._borderValue = borderValue;\n    return items;\n  }\n  _computeLabelItems(chartArea) {\n    const axis = this.axis;\n    const options = this.options;\n    const {position, ticks: optionTicks} = options;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const {align, crossAlign, padding, mirror} = optionTicks;\n    const tl = getTickMarkLength(options.grid);\n    const tickAndPadding = tl + padding;\n    const hTickAndPadding = mirror ? -padding : tickAndPadding;\n    const rotation = -toRadians(this.labelRotation);\n    const items = [];\n    let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n    let textBaseline = 'middle';\n    if (position === 'top') {\n      y = this.bottom - hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'bottom') {\n      y = this.top + hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'left') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (position === 'right') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n      }\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        x = this.chart.scales[positionAxisID].getPixelForValue(value);\n      }\n      textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n    }\n    if (axis === 'y') {\n      if (align === 'start') {\n        textBaseline = 'top';\n      } else if (align === 'end') {\n        textBaseline = 'bottom';\n      }\n    }\n    const labelSizes = this._getLabelSizes();\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      label = tick.label;\n      const optsAtIndex = optionTicks.setContext(this.getContext(i));\n      pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n      font = this._resolveTickFontOptions(i);\n      lineHeight = font.lineHeight;\n      lineCount = isArray(label) ? label.length : 1;\n      const halfCount = lineCount / 2;\n      const color = optsAtIndex.color;\n      const strokeColor = optsAtIndex.textStrokeColor;\n      const strokeWidth = optsAtIndex.textStrokeWidth;\n      if (isHorizontal) {\n        x = pixel;\n        if (position === 'top') {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = -lineCount * lineHeight + lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n          } else {\n            textOffset = -labelSizes.highest.height + lineHeight / 2;\n          }\n        } else {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n          } else {\n            textOffset = labelSizes.highest.height - lineCount * lineHeight;\n          }\n        }\n        if (mirror) {\n          textOffset *= -1;\n        }\n      } else {\n        y = pixel;\n        textOffset = (1 - lineCount) * lineHeight / 2;\n      }\n      let backdrop;\n      if (optsAtIndex.showLabelBackdrop) {\n        const labelPadding = toPadding(optsAtIndex.backdropPadding);\n        const height = labelSizes.heights[i];\n        const width = labelSizes.widths[i];\n        let top = y + textOffset - labelPadding.top;\n        let left = x - labelPadding.left;\n        switch (textBaseline) {\n        case 'middle':\n          top -= height / 2;\n          break;\n        case 'bottom':\n          top -= height;\n          break;\n        }\n        switch (textAlign) {\n        case 'center':\n          left -= width / 2;\n          break;\n        case 'right':\n          left -= width;\n          break;\n        }\n        backdrop = {\n          left,\n          top,\n          width: width + labelPadding.width,\n          height: height + labelPadding.height,\n          color: optsAtIndex.backdropColor,\n        };\n      }\n      items.push({\n        rotation,\n        label,\n        font,\n        color,\n        strokeColor,\n        strokeWidth,\n        textOffset,\n        textAlign,\n        textBaseline,\n        translation: [x, y],\n        backdrop,\n      });\n    }\n    return items;\n  }\n  _getXAxisLabelAlignment() {\n    const {position, ticks} = this.options;\n    const rotation = -toRadians(this.labelRotation);\n    if (rotation) {\n      return position === 'top' ? 'left' : 'right';\n    }\n    let align = 'center';\n    if (ticks.align === 'start') {\n      align = 'left';\n    } else if (ticks.align === 'end') {\n      align = 'right';\n    }\n    return align;\n  }\n  _getYAxisLabelAlignment(tl) {\n    const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n    const labelSizes = this._getLabelSizes();\n    const tickAndPadding = tl + padding;\n    const widest = labelSizes.widest.width;\n    let textAlign;\n    let x;\n    if (position === 'left') {\n      if (mirror) {\n        x = this.right + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += (widest / 2);\n        } else {\n          textAlign = 'right';\n          x += widest;\n        }\n      } else {\n        x = this.right - tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x = this.left;\n        }\n      }\n    } else if (position === 'right') {\n      if (mirror) {\n        x = this.left + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x -= widest;\n        }\n      } else {\n        x = this.left + tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += widest / 2;\n        } else {\n          textAlign = 'right';\n          x = this.right;\n        }\n      }\n    } else {\n      textAlign = 'right';\n    }\n    return {textAlign, x};\n  }\n  _computeLabelArea() {\n    if (this.options.ticks.mirror) {\n      return;\n    }\n    const chart = this.chart;\n    const position = this.options.position;\n    if (position === 'left' || position === 'right') {\n      return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n    } if (position === 'top' || position === 'bottom') {\n      return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n    }\n  }\n  drawBackground() {\n    const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n    if (backgroundColor) {\n      ctx.save();\n      ctx.fillStyle = backgroundColor;\n      ctx.fillRect(left, top, width, height);\n      ctx.restore();\n    }\n  }\n  getLineWidthForValue(value) {\n    const grid = this.options.grid;\n    if (!this._isVisible() || !grid.display) {\n      return 0;\n    }\n    const ticks = this.ticks;\n    const index = ticks.findIndex(t => t.value === value);\n    if (index >= 0) {\n      const opts = grid.setContext(this.getContext(index));\n      return opts.lineWidth;\n    }\n    return 0;\n  }\n  drawGrid(chartArea) {\n    const grid = this.options.grid;\n    const ctx = this.ctx;\n    const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n    let i, ilen;\n    const drawLine = (p1, p2, style) => {\n      if (!style.width || !style.color) {\n        return;\n      }\n      ctx.save();\n      ctx.lineWidth = style.width;\n      ctx.strokeStyle = style.color;\n      ctx.setLineDash(style.borderDash || []);\n      ctx.lineDashOffset = style.borderDashOffset;\n      ctx.beginPath();\n      ctx.moveTo(p1.x, p1.y);\n      ctx.lineTo(p2.x, p2.y);\n      ctx.stroke();\n      ctx.restore();\n    };\n    if (grid.display) {\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        const item = items[i];\n        if (grid.drawOnChartArea) {\n          drawLine(\n            {x: item.x1, y: item.y1},\n            {x: item.x2, y: item.y2},\n            item\n          );\n        }\n        if (grid.drawTicks) {\n          drawLine(\n            {x: item.tx1, y: item.ty1},\n            {x: item.tx2, y: item.ty2},\n            {\n              color: item.tickColor,\n              width: item.tickWidth,\n              borderDash: item.tickBorderDash,\n              borderDashOffset: item.tickBorderDashOffset\n            }\n          );\n        }\n      }\n    }\n  }\n  drawBorder() {\n    const {chart, ctx, options: {grid}} = this;\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n    if (!axisWidth) {\n      return;\n    }\n    const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n    const borderValue = this._borderValue;\n    let x1, x2, y1, y2;\n    if (this.isHorizontal()) {\n      x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n      x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n      y1 = y2 = borderValue;\n    } else {\n      y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n      y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n      x1 = x2 = borderValue;\n    }\n    ctx.save();\n    ctx.lineWidth = borderOpts.borderWidth;\n    ctx.strokeStyle = borderOpts.borderColor;\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n    ctx.restore();\n  }\n  drawLabels(chartArea) {\n    const optionTicks = this.options.ticks;\n    if (!optionTicks.display) {\n      return;\n    }\n    const ctx = this.ctx;\n    const area = this._computeLabelArea();\n    if (area) {\n      clipArea(ctx, area);\n    }\n    const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n    let i, ilen;\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      const item = items[i];\n      const tickFont = item.font;\n      const label = item.label;\n      if (item.backdrop) {\n        ctx.fillStyle = item.backdrop.color;\n        ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n      }\n      let y = item.textOffset;\n      renderText(ctx, label, 0, y, tickFont, item);\n    }\n    if (area) {\n      unclipArea(ctx);\n    }\n  }\n  drawTitle() {\n    const {ctx, options: {position, title, reverse}} = this;\n    if (!title.display) {\n      return;\n    }\n    const font = toFont(title.font);\n    const padding = toPadding(title.padding);\n    const align = title.align;\n    let offset = font.lineHeight / 2;\n    if (position === 'bottom' || position === 'center' || isObject(position)) {\n      offset += padding.bottom;\n      if (isArray(title.text)) {\n        offset += font.lineHeight * (title.text.length - 1);\n      }\n    } else {\n      offset += padding.top;\n    }\n    const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n    renderText(ctx, title.text, 0, 0, font, {\n      color: title.color,\n      maxWidth,\n      rotation,\n      textAlign: titleAlign(align, position, reverse),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n  draw(chartArea) {\n    if (!this._isVisible()) {\n      return;\n    }\n    this.drawBackground();\n    this.drawGrid(chartArea);\n    this.drawBorder();\n    this.drawTitle();\n    this.drawLabels(chartArea);\n  }\n  _layers() {\n    const opts = this.options;\n    const tz = opts.ticks && opts.ticks.z || 0;\n    const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n    if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n      return [{\n        z: tz,\n        draw: (chartArea) => {\n          this.draw(chartArea);\n        }\n      }];\n    }\n    return [{\n      z: gz,\n      draw: (chartArea) => {\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawTitle();\n      }\n    }, {\n      z: gz + 1,\n      draw: () => {\n        this.drawBorder();\n      }\n    }, {\n      z: tz,\n      draw: (chartArea) => {\n        this.drawLabels(chartArea);\n      }\n    }];\n  }\n  getMatchingVisibleMetas(type) {\n    const metas = this.chart.getSortedVisibleDatasetMetas();\n    const axisID = this.axis + 'AxisID';\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      const meta = metas[i];\n      if (meta[axisID] === this.id && (!type || meta.type === type)) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  _resolveTickFontOptions(index) {\n    const opts = this.options.ticks.setContext(this.getContext(index));\n    return toFont(opts.font);\n  }\n  _maxDigits() {\n    const fontSize = this._resolveTickFontOptions(0).lineHeight;\n    return (this.isHorizontal() ? this.width : this.height) / fontSize;\n  }\n}\n\nclass TypedRegistry {\n  constructor(type, scope, override) {\n    this.type = type;\n    this.scope = scope;\n    this.override = override;\n    this.items = Object.create(null);\n  }\n  isForType(type) {\n    return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n  }\n  register(item) {\n    const proto = Object.getPrototypeOf(item);\n    let parentScope;\n    if (isIChartComponent(proto)) {\n      parentScope = this.register(proto);\n    }\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope + '.' + id;\n    if (!id) {\n      throw new Error('class does not have id: ' + item);\n    }\n    if (id in items) {\n      return scope;\n    }\n    items[id] = item;\n    registerDefaults(item, scope, parentScope);\n    if (this.override) {\n      defaults.override(item.id, item.overrides);\n    }\n    return scope;\n  }\n  get(id) {\n    return this.items[id];\n  }\n  unregister(item) {\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope;\n    if (id in items) {\n      delete items[id];\n    }\n    if (scope && id in defaults[scope]) {\n      delete defaults[scope][id];\n      if (this.override) {\n        delete overrides[id];\n      }\n    }\n  }\n}\nfunction registerDefaults(item, scope, parentScope) {\n  const itemDefaults = merge(Object.create(null), [\n    parentScope ? defaults.get(parentScope) : {},\n    defaults.get(scope),\n    item.defaults\n  ]);\n  defaults.set(scope, itemDefaults);\n  if (item.defaultRoutes) {\n    routeDefaults(scope, item.defaultRoutes);\n  }\n  if (item.descriptors) {\n    defaults.describe(scope, item.descriptors);\n  }\n}\nfunction routeDefaults(scope, routes) {\n  Object.keys(routes).forEach(property => {\n    const propertyParts = property.split('.');\n    const sourceName = propertyParts.pop();\n    const sourceScope = [scope].concat(propertyParts).join('.');\n    const parts = routes[property].split('.');\n    const targetName = parts.pop();\n    const targetScope = parts.join('.');\n    defaults.route(sourceScope, sourceName, targetScope, targetName);\n  });\n}\nfunction isIChartComponent(proto) {\n  return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n  constructor() {\n    this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n    this.elements = new TypedRegistry(Element, 'elements');\n    this.plugins = new TypedRegistry(Object, 'plugins');\n    this.scales = new TypedRegistry(Scale, 'scales');\n    this._typedRegistries = [this.controllers, this.scales, this.elements];\n  }\n  add(...args) {\n    this._each('register', args);\n  }\n  remove(...args) {\n    this._each('unregister', args);\n  }\n  addControllers(...args) {\n    this._each('register', args, this.controllers);\n  }\n  addElements(...args) {\n    this._each('register', args, this.elements);\n  }\n  addPlugins(...args) {\n    this._each('register', args, this.plugins);\n  }\n  addScales(...args) {\n    this._each('register', args, this.scales);\n  }\n  getController(id) {\n    return this._get(id, this.controllers, 'controller');\n  }\n  getElement(id) {\n    return this._get(id, this.elements, 'element');\n  }\n  getPlugin(id) {\n    return this._get(id, this.plugins, 'plugin');\n  }\n  getScale(id) {\n    return this._get(id, this.scales, 'scale');\n  }\n  removeControllers(...args) {\n    this._each('unregister', args, this.controllers);\n  }\n  removeElements(...args) {\n    this._each('unregister', args, this.elements);\n  }\n  removePlugins(...args) {\n    this._each('unregister', args, this.plugins);\n  }\n  removeScales(...args) {\n    this._each('unregister', args, this.scales);\n  }\n  _each(method, args, typedRegistry) {\n    [...args].forEach(arg => {\n      const reg = typedRegistry || this._getRegistryForType(arg);\n      if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n        this._exec(method, reg, arg);\n      } else {\n        each(arg, item => {\n          const itemReg = typedRegistry || this._getRegistryForType(item);\n          this._exec(method, itemReg, item);\n        });\n      }\n    });\n  }\n  _exec(method, registry, component) {\n    const camelMethod = _capitalize(method);\n    callback(component['before' + camelMethod], [], component);\n    registry[method](component);\n    callback(component['after' + camelMethod], [], component);\n  }\n  _getRegistryForType(type) {\n    for (let i = 0; i < this._typedRegistries.length; i++) {\n      const reg = this._typedRegistries[i];\n      if (reg.isForType(type)) {\n        return reg;\n      }\n    }\n    return this.plugins;\n  }\n  _get(id, typedRegistry, type) {\n    const item = typedRegistry.get(id);\n    if (item === undefined) {\n      throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n    }\n    return item;\n  }\n}\nvar registry = new Registry();\n\nclass PluginService {\n  constructor() {\n    this._init = [];\n  }\n  notify(chart, hook, args, filter) {\n    if (hook === 'beforeInit') {\n      this._init = this._createDescriptors(chart, true);\n      this._notify(this._init, chart, 'install');\n    }\n    const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n    const result = this._notify(descriptors, chart, hook, args);\n    if (hook === 'afterDestroy') {\n      this._notify(descriptors, chart, 'stop');\n      this._notify(this._init, chart, 'uninstall');\n    }\n    return result;\n  }\n  _notify(descriptors, chart, hook, args) {\n    args = args || {};\n    for (const descriptor of descriptors) {\n      const plugin = descriptor.plugin;\n      const method = plugin[hook];\n      const params = [chart, args, descriptor.options];\n      if (callback(method, params, plugin) === false && args.cancelable) {\n        return false;\n      }\n    }\n    return true;\n  }\n  invalidate() {\n    if (!isNullOrUndef(this._cache)) {\n      this._oldCache = this._cache;\n      this._cache = undefined;\n    }\n  }\n  _descriptors(chart) {\n    if (this._cache) {\n      return this._cache;\n    }\n    const descriptors = this._cache = this._createDescriptors(chart);\n    this._notifyStateChanges(chart);\n    return descriptors;\n  }\n  _createDescriptors(chart, all) {\n    const config = chart && chart.config;\n    const options = valueOrDefault(config.options && config.options.plugins, {});\n    const plugins = allPlugins(config);\n    return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n  }\n  _notifyStateChanges(chart) {\n    const previousDescriptors = this._oldCache || [];\n    const descriptors = this._cache;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n    this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n    this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n  }\n}\nfunction allPlugins(config) {\n  const plugins = [];\n  const keys = Object.keys(registry.plugins.items);\n  for (let i = 0; i < keys.length; i++) {\n    plugins.push(registry.getPlugin(keys[i]));\n  }\n  const local = config.plugins || [];\n  for (let i = 0; i < local.length; i++) {\n    const plugin = local[i];\n    if (plugins.indexOf(plugin) === -1) {\n      plugins.push(plugin);\n    }\n  }\n  return plugins;\n}\nfunction getOpts(options, all) {\n  if (!all && options === false) {\n    return null;\n  }\n  if (options === true) {\n    return {};\n  }\n  return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n  const result = [];\n  const context = chart.getContext();\n  for (let i = 0; i < plugins.length; i++) {\n    const plugin = plugins[i];\n    const id = plugin.id;\n    const opts = getOpts(options[id], all);\n    if (opts === null) {\n      continue;\n    }\n    result.push({\n      plugin,\n      options: pluginOpts(chart.config, plugin, opts, context)\n    });\n  }\n  return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n  const keys = config.pluginScopeKeys(plugin);\n  const scopes = config.getOptionScopes(opts, keys);\n  return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n  const datasetDefaults = defaults.datasets[type] || {};\n  const datasetOptions = (options.datasets || {})[type] || {};\n  return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n  let axis = id;\n  if (id === '_index_') {\n    axis = indexAxis;\n  } else if (id === '_value_') {\n    axis = indexAxis === 'x' ? 'y' : 'x';\n  }\n  return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n  return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n  if (position === 'top' || position === 'bottom') {\n    return 'x';\n  }\n  if (position === 'left' || position === 'right') {\n    return 'y';\n  }\n}\nfunction determineAxis(id, scaleOptions) {\n  if (id === 'x' || id === 'y') {\n    return id;\n  }\n  return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n  const chartDefaults = overrides[config.type] || {scales: {}};\n  const configScales = options.scales || {};\n  const chartIndexAxis = getIndexAxis(config.type, options);\n  const firstIDs = Object.create(null);\n  const scales = Object.create(null);\n  Object.keys(configScales).forEach(id => {\n    const scaleConf = configScales[id];\n    if (!isObject(scaleConf)) {\n      return console.error(`Invalid scale configuration for scale: ${id}`);\n    }\n    if (scaleConf._proxy) {\n      return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n    }\n    const axis = determineAxis(id, scaleConf);\n    const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n    const defaultScaleOptions = chartDefaults.scales || {};\n    firstIDs[axis] = firstIDs[axis] || id;\n    scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n  });\n  config.data.datasets.forEach(dataset => {\n    const type = dataset.type || config.type;\n    const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n    const datasetDefaults = overrides[type] || {};\n    const defaultScaleOptions = datasetDefaults.scales || {};\n    Object.keys(defaultScaleOptions).forEach(defaultID => {\n      const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n      const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n      scales[id] = scales[id] || Object.create(null);\n      mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n    });\n  });\n  Object.keys(scales).forEach(key => {\n    const scale = scales[key];\n    mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n  });\n  return scales;\n}\nfunction initOptions(config) {\n  const options = config.options || (config.options = {});\n  options.plugins = valueOrDefault(options.plugins, {});\n  options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n  data = data || {};\n  data.datasets = data.datasets || [];\n  data.labels = data.labels || [];\n  return data;\n}\nfunction initConfig(config) {\n  config = config || {};\n  config.data = initData(config.data);\n  initOptions(config);\n  return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n  let keys = keyCache.get(cacheKey);\n  if (!keys) {\n    keys = generate();\n    keyCache.set(cacheKey, keys);\n    keysCached.add(keys);\n  }\n  return keys;\n}\nconst addIfFound = (set, obj, key) => {\n  const opts = resolveObjectKey(obj, key);\n  if (opts !== undefined) {\n    set.add(opts);\n  }\n};\nclass Config {\n  constructor(config) {\n    this._config = initConfig(config);\n    this._scopeCache = new Map();\n    this._resolverCache = new Map();\n  }\n  get platform() {\n    return this._config.platform;\n  }\n  get type() {\n    return this._config.type;\n  }\n  set type(type) {\n    this._config.type = type;\n  }\n  get data() {\n    return this._config.data;\n  }\n  set data(data) {\n    this._config.data = initData(data);\n  }\n  get options() {\n    return this._config.options;\n  }\n  set options(options) {\n    this._config.options = options;\n  }\n  get plugins() {\n    return this._config.plugins;\n  }\n  update() {\n    const config = this._config;\n    this.clearCache();\n    initOptions(config);\n  }\n  clearCache() {\n    this._scopeCache.clear();\n    this._resolverCache.clear();\n  }\n  datasetScopeKeys(datasetType) {\n    return cachedKeys(datasetType,\n      () => [[\n        `datasets.${datasetType}`,\n        ''\n      ]]);\n  }\n  datasetAnimationScopeKeys(datasetType, transition) {\n    return cachedKeys(`${datasetType}.transition.${transition}`,\n      () => [\n        [\n          `datasets.${datasetType}.transitions.${transition}`,\n          `transitions.${transition}`,\n        ],\n        [\n          `datasets.${datasetType}`,\n          ''\n        ]\n      ]);\n  }\n  datasetElementScopeKeys(datasetType, elementType) {\n    return cachedKeys(`${datasetType}-${elementType}`,\n      () => [[\n        `datasets.${datasetType}.elements.${elementType}`,\n        `datasets.${datasetType}`,\n        `elements.${elementType}`,\n        ''\n      ]]);\n  }\n  pluginScopeKeys(plugin) {\n    const id = plugin.id;\n    const type = this.type;\n    return cachedKeys(`${type}-plugin-${id}`,\n      () => [[\n        `plugins.${id}`,\n        ...plugin.additionalOptionScopes || [],\n      ]]);\n  }\n  _cachedScopes(mainScope, resetCache) {\n    const _scopeCache = this._scopeCache;\n    let cache = _scopeCache.get(mainScope);\n    if (!cache || resetCache) {\n      cache = new Map();\n      _scopeCache.set(mainScope, cache);\n    }\n    return cache;\n  }\n  getOptionScopes(mainScope, keyLists, resetCache) {\n    const {options, type} = this;\n    const cache = this._cachedScopes(mainScope, resetCache);\n    const cached = cache.get(keyLists);\n    if (cached) {\n      return cached;\n    }\n    const scopes = new Set();\n    keyLists.forEach(keys => {\n      if (mainScope) {\n        scopes.add(mainScope);\n        keys.forEach(key => addIfFound(scopes, mainScope, key));\n      }\n      keys.forEach(key => addIfFound(scopes, options, key));\n      keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n      keys.forEach(key => addIfFound(scopes, defaults, key));\n      keys.forEach(key => addIfFound(scopes, descriptors, key));\n    });\n    const array = Array.from(scopes);\n    if (array.length === 0) {\n      array.push(Object.create(null));\n    }\n    if (keysCached.has(keyLists)) {\n      cache.set(keyLists, array);\n    }\n    return array;\n  }\n  chartOptionScopes() {\n    const {options, type} = this;\n    return [\n      options,\n      overrides[type] || {},\n      defaults.datasets[type] || {},\n      {type},\n      defaults,\n      descriptors\n    ];\n  }\n  resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n    const result = {$shared: true};\n    const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n    let options = resolver;\n    if (needContext(resolver, names)) {\n      result.$shared = false;\n      context = isFunction(context) ? context() : context;\n      const subResolver = this.createResolver(scopes, context, subPrefixes);\n      options = _attachContext(resolver, context, subResolver);\n    }\n    for (const prop of names) {\n      result[prop] = options[prop];\n    }\n    return result;\n  }\n  createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n    const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n    return isObject(context)\n      ? _attachContext(resolver, context, undefined, descriptorDefaults)\n      : resolver;\n  }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n  let cache = resolverCache.get(scopes);\n  if (!cache) {\n    cache = new Map();\n    resolverCache.set(scopes, cache);\n  }\n  const cacheKey = prefixes.join();\n  let cached = cache.get(cacheKey);\n  if (!cached) {\n    const resolver = _createResolver(scopes, prefixes);\n    cached = {\n      resolver,\n      subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n    };\n    cache.set(cacheKey, cached);\n  }\n  return cached;\n}\nconst hasFunction = value => isObject(value)\n  && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\nfunction needContext(proxy, names) {\n  const {isScriptable, isIndexable} = _descriptors(proxy);\n  for (const prop of names) {\n    const scriptable = isScriptable(prop);\n    const indexable = isIndexable(prop);\n    const value = (indexable || scriptable) && proxy[prop];\n    if ((scriptable && (isFunction(value) || hasFunction(value)))\n      || (indexable && isArray(value))) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvar version = \"3.7.1\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n  return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n  return function(a, b) {\n    return a[l1] === b[l1]\n      ? a[l2] - b[l2]\n      : a[l1] - b[l1];\n  };\n}\nfunction onAnimationsComplete(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  chart.notifyPlugins('afterRender');\n  callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n  if (_isDomSupported() && typeof item === 'string') {\n    item = document.getElementById(item);\n  } else if (item && item.length) {\n    item = item[0];\n  }\n  if (item && item.canvas) {\n    item = item.canvas;\n  }\n  return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n  const canvas = getCanvas(key);\n  return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n  const keys = Object.keys(obj);\n  for (const key of keys) {\n    const intKey = +key;\n    if (intKey >= start) {\n      const value = obj[key];\n      delete obj[key];\n      if (move > 0 || intKey > start) {\n        obj[intKey + move] = value;\n      }\n    }\n  }\n}\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n  if (!inChartArea || e.type === 'mouseout') {\n    return null;\n  }\n  if (isClick) {\n    return lastEvent;\n  }\n  return e;\n}\nclass Chart {\n  constructor(item, userConfig) {\n    const config = this.config = new Config(userConfig);\n    const initialCanvas = getCanvas(item);\n    const existingChart = getChart(initialCanvas);\n    if (existingChart) {\n      throw new Error(\n        'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n      );\n    }\n    const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n    this.platform.updateConfig(config);\n    const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n    const canvas = context && context.canvas;\n    const height = canvas && canvas.height;\n    const width = canvas && canvas.width;\n    this.id = uid();\n    this.ctx = context;\n    this.canvas = canvas;\n    this.width = width;\n    this.height = height;\n    this._options = options;\n    this._aspectRatio = this.aspectRatio;\n    this._layers = [];\n    this._metasets = [];\n    this._stacks = undefined;\n    this.boxes = [];\n    this.currentDevicePixelRatio = undefined;\n    this.chartArea = undefined;\n    this._active = [];\n    this._lastEvent = undefined;\n    this._listeners = {};\n    this._responsiveListeners = undefined;\n    this._sortedMetasets = [];\n    this.scales = {};\n    this._plugins = new PluginService();\n    this.$proxies = {};\n    this._hiddenIndices = {};\n    this.attached = false;\n    this._animationsDisabled = undefined;\n    this.$context = undefined;\n    this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n    this._dataChanges = [];\n    instances[this.id] = this;\n    if (!context || !canvas) {\n      console.error(\"Failed to create chart: can't acquire context from the given item\");\n      return;\n    }\n    animator.listen(this, 'complete', onAnimationsComplete);\n    animator.listen(this, 'progress', onAnimationProgress);\n    this._initialize();\n    if (this.attached) {\n      this.update();\n    }\n  }\n  get aspectRatio() {\n    const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n    if (!isNullOrUndef(aspectRatio)) {\n      return aspectRatio;\n    }\n    if (maintainAspectRatio && _aspectRatio) {\n      return _aspectRatio;\n    }\n    return height ? width / height : null;\n  }\n  get data() {\n    return this.config.data;\n  }\n  set data(data) {\n    this.config.data = data;\n  }\n  get options() {\n    return this._options;\n  }\n  set options(options) {\n    this.config.options = options;\n  }\n  _initialize() {\n    this.notifyPlugins('beforeInit');\n    if (this.options.responsive) {\n      this.resize();\n    } else {\n      retinaScale(this, this.options.devicePixelRatio);\n    }\n    this.bindEvents();\n    this.notifyPlugins('afterInit');\n    return this;\n  }\n  clear() {\n    clearCanvas(this.canvas, this.ctx);\n    return this;\n  }\n  stop() {\n    animator.stop(this);\n    return this;\n  }\n  resize(width, height) {\n    if (!animator.running(this)) {\n      this._resize(width, height);\n    } else {\n      this._resizeBeforeDraw = {width, height};\n    }\n  }\n  _resize(width, height) {\n    const options = this.options;\n    const canvas = this.canvas;\n    const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n    const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n    const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n    const mode = this.width ? 'resize' : 'attach';\n    this.width = newSize.width;\n    this.height = newSize.height;\n    this._aspectRatio = this.aspectRatio;\n    if (!retinaScale(this, newRatio, true)) {\n      return;\n    }\n    this.notifyPlugins('resize', {size: newSize});\n    callback(options.onResize, [this, newSize], this);\n    if (this.attached) {\n      if (this._doResize(mode)) {\n        this.render();\n      }\n    }\n  }\n  ensureScalesHaveIDs() {\n    const options = this.options;\n    const scalesOptions = options.scales || {};\n    each(scalesOptions, (axisOptions, axisID) => {\n      axisOptions.id = axisID;\n    });\n  }\n  buildOrUpdateScales() {\n    const options = this.options;\n    const scaleOpts = options.scales;\n    const scales = this.scales;\n    const updated = Object.keys(scales).reduce((obj, id) => {\n      obj[id] = false;\n      return obj;\n    }, {});\n    let items = [];\n    if (scaleOpts) {\n      items = items.concat(\n        Object.keys(scaleOpts).map((id) => {\n          const scaleOptions = scaleOpts[id];\n          const axis = determineAxis(id, scaleOptions);\n          const isRadial = axis === 'r';\n          const isHorizontal = axis === 'x';\n          return {\n            options: scaleOptions,\n            dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n            dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n          };\n        })\n      );\n    }\n    each(items, (item) => {\n      const scaleOptions = item.options;\n      const id = scaleOptions.id;\n      const axis = determineAxis(id, scaleOptions);\n      const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n      if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n        scaleOptions.position = item.dposition;\n      }\n      updated[id] = true;\n      let scale = null;\n      if (id in scales && scales[id].type === scaleType) {\n        scale = scales[id];\n      } else {\n        const scaleClass = registry.getScale(scaleType);\n        scale = new scaleClass({\n          id,\n          type: scaleType,\n          ctx: this.ctx,\n          chart: this\n        });\n        scales[scale.id] = scale;\n      }\n      scale.init(scaleOptions, options);\n    });\n    each(updated, (hasUpdated, id) => {\n      if (!hasUpdated) {\n        delete scales[id];\n      }\n    });\n    each(scales, (scale) => {\n      layouts.configure(this, scale, scale.options);\n      layouts.addBox(this, scale);\n    });\n  }\n  _updateMetasets() {\n    const metasets = this._metasets;\n    const numData = this.data.datasets.length;\n    const numMeta = metasets.length;\n    metasets.sort((a, b) => a.index - b.index);\n    if (numMeta > numData) {\n      for (let i = numData; i < numMeta; ++i) {\n        this._destroyDatasetMeta(i);\n      }\n      metasets.splice(numData, numMeta - numData);\n    }\n    this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n  }\n  _removeUnreferencedMetasets() {\n    const {_metasets: metasets, data: {datasets}} = this;\n    if (metasets.length > datasets.length) {\n      delete this._stacks;\n    }\n    metasets.forEach((meta, index) => {\n      if (datasets.filter(x => x === meta._dataset).length === 0) {\n        this._destroyDatasetMeta(index);\n      }\n    });\n  }\n  buildOrUpdateControllers() {\n    const newControllers = [];\n    const datasets = this.data.datasets;\n    let i, ilen;\n    this._removeUnreferencedMetasets();\n    for (i = 0, ilen = datasets.length; i < ilen; i++) {\n      const dataset = datasets[i];\n      let meta = this.getDatasetMeta(i);\n      const type = dataset.type || this.config.type;\n      if (meta.type && meta.type !== type) {\n        this._destroyDatasetMeta(i);\n        meta = this.getDatasetMeta(i);\n      }\n      meta.type = type;\n      meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n      meta.order = dataset.order || 0;\n      meta.index = i;\n      meta.label = '' + dataset.label;\n      meta.visible = this.isDatasetVisible(i);\n      if (meta.controller) {\n        meta.controller.updateIndex(i);\n        meta.controller.linkScales();\n      } else {\n        const ControllerClass = registry.getController(type);\n        const {datasetElementType, dataElementType} = defaults.datasets[type];\n        Object.assign(ControllerClass.prototype, {\n          dataElementType: registry.getElement(dataElementType),\n          datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n        });\n        meta.controller = new ControllerClass(this, i);\n        newControllers.push(meta.controller);\n      }\n    }\n    this._updateMetasets();\n    return newControllers;\n  }\n  _resetElements() {\n    each(this.data.datasets, (dataset, datasetIndex) => {\n      this.getDatasetMeta(datasetIndex).controller.reset();\n    }, this);\n  }\n  reset() {\n    this._resetElements();\n    this.notifyPlugins('reset');\n  }\n  update(mode) {\n    const config = this.config;\n    config.update();\n    const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    const animsDisabled = this._animationsDisabled = !options.animation;\n    this._updateScales();\n    this._checkEventBindings();\n    this._updateHiddenIndices();\n    this._plugins.invalidate();\n    if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    const newControllers = this.buildOrUpdateControllers();\n    this.notifyPlugins('beforeElementsUpdate');\n    let minPadding = 0;\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n      const {controller} = this.getDatasetMeta(i);\n      const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n      controller.buildOrUpdateElements(reset);\n      minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n    }\n    minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n    this._updateLayout(minPadding);\n    if (!animsDisabled) {\n      each(newControllers, (controller) => {\n        controller.reset();\n      });\n    }\n    this._updateDatasets(mode);\n    this.notifyPlugins('afterUpdate', {mode});\n    this._layers.sort(compare2Level('z', '_idx'));\n    const {_active, _lastEvent} = this;\n    if (_lastEvent) {\n      this._eventHandler(_lastEvent, true);\n    } else if (_active.length) {\n      this._updateHoverStyles(_active, _active, true);\n    }\n    this.render();\n  }\n  _updateScales() {\n    each(this.scales, (scale) => {\n      layouts.removeBox(this, scale);\n    });\n    this.ensureScalesHaveIDs();\n    this.buildOrUpdateScales();\n  }\n  _checkEventBindings() {\n    const options = this.options;\n    const existingEvents = new Set(Object.keys(this._listeners));\n    const newEvents = new Set(options.events);\n    if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n      this.unbindEvents();\n      this.bindEvents();\n    }\n  }\n  _updateHiddenIndices() {\n    const {_hiddenIndices} = this;\n    const changes = this._getUniformDataChanges() || [];\n    for (const {method, start, count} of changes) {\n      const move = method === '_removeElements' ? -count : count;\n      moveNumericKeys(_hiddenIndices, start, move);\n    }\n  }\n  _getUniformDataChanges() {\n    const _dataChanges = this._dataChanges;\n    if (!_dataChanges || !_dataChanges.length) {\n      return;\n    }\n    this._dataChanges = [];\n    const datasetCount = this.data.datasets.length;\n    const makeSet = (idx) => new Set(\n      _dataChanges\n        .filter(c => c[0] === idx)\n        .map((c, i) => i + ',' + c.splice(1).join(','))\n    );\n    const changeSet = makeSet(0);\n    for (let i = 1; i < datasetCount; i++) {\n      if (!setsEqual(changeSet, makeSet(i))) {\n        return;\n      }\n    }\n    return Array.from(changeSet)\n      .map(c => c.split(','))\n      .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n  }\n  _updateLayout(minPadding) {\n    if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n      return;\n    }\n    layouts.update(this, this.width, this.height, minPadding);\n    const area = this.chartArea;\n    const noArea = area.width <= 0 || area.height <= 0;\n    this._layers = [];\n    each(this.boxes, (box) => {\n      if (noArea && box.position === 'chartArea') {\n        return;\n      }\n      if (box.configure) {\n        box.configure();\n      }\n      this._layers.push(...box._layers());\n    }, this);\n    this._layers.forEach((item, index) => {\n      item._idx = index;\n    });\n    this.notifyPlugins('afterLayout');\n  }\n  _updateDatasets(mode) {\n    if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this.getDatasetMeta(i).controller.configure();\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n    }\n    this.notifyPlugins('afterDatasetsUpdate', {mode});\n  }\n  _updateDataset(index, mode) {\n    const meta = this.getDatasetMeta(index);\n    const args = {meta, index, mode, cancelable: true};\n    if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n      return;\n    }\n    meta.controller._update(mode);\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetUpdate', args);\n  }\n  render() {\n    if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n      return;\n    }\n    if (animator.has(this)) {\n      if (this.attached && !animator.running(this)) {\n        animator.start(this);\n      }\n    } else {\n      this.draw();\n      onAnimationsComplete({chart: this});\n    }\n  }\n  draw() {\n    let i;\n    if (this._resizeBeforeDraw) {\n      const {width, height} = this._resizeBeforeDraw;\n      this._resize(width, height);\n      this._resizeBeforeDraw = null;\n    }\n    this.clear();\n    if (this.width <= 0 || this.height <= 0) {\n      return;\n    }\n    if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const layers = this._layers;\n    for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this._drawDatasets();\n    for (; i < layers.length; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this.notifyPlugins('afterDraw');\n  }\n  _getSortedDatasetMetas(filterVisible) {\n    const metasets = this._sortedMetasets;\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n      const meta = metasets[i];\n      if (!filterVisible || meta.visible) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  getSortedVisibleDatasetMetas() {\n    return this._getSortedDatasetMetas(true);\n  }\n  _drawDatasets() {\n    if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const metasets = this.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      this._drawDataset(metasets[i]);\n    }\n    this.notifyPlugins('afterDatasetsDraw');\n  }\n  _drawDataset(meta) {\n    const ctx = this.ctx;\n    const clip = meta._clip;\n    const useClip = !clip.disabled;\n    const area = this.chartArea;\n    const args = {\n      meta,\n      index: meta.index,\n      cancelable: true\n    };\n    if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n      return;\n    }\n    if (useClip) {\n      clipArea(ctx, {\n        left: clip.left === false ? 0 : area.left - clip.left,\n        right: clip.right === false ? this.width : area.right + clip.right,\n        top: clip.top === false ? 0 : area.top - clip.top,\n        bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n      });\n    }\n    meta.controller.draw();\n    if (useClip) {\n      unclipArea(ctx);\n    }\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetDraw', args);\n  }\n  getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n    const method = Interaction.modes[mode];\n    if (typeof method === 'function') {\n      return method(this, e, options, useFinalPosition);\n    }\n    return [];\n  }\n  getDatasetMeta(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    const metasets = this._metasets;\n    let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n    if (!meta) {\n      meta = {\n        type: null,\n        data: [],\n        dataset: null,\n        controller: null,\n        hidden: null,\n        xAxisID: null,\n        yAxisID: null,\n        order: dataset && dataset.order || 0,\n        index: datasetIndex,\n        _dataset: dataset,\n        _parsed: [],\n        _sorted: false\n      };\n      metasets.push(meta);\n    }\n    return meta;\n  }\n  getContext() {\n    return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n  }\n  getVisibleDatasetCount() {\n    return this.getSortedVisibleDatasetMetas().length;\n  }\n  isDatasetVisible(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    if (!dataset) {\n      return false;\n    }\n    const meta = this.getDatasetMeta(datasetIndex);\n    return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n  }\n  setDatasetVisibility(datasetIndex, visible) {\n    const meta = this.getDatasetMeta(datasetIndex);\n    meta.hidden = !visible;\n  }\n  toggleDataVisibility(index) {\n    this._hiddenIndices[index] = !this._hiddenIndices[index];\n  }\n  getDataVisibility(index) {\n    return !this._hiddenIndices[index];\n  }\n  _updateVisibility(datasetIndex, dataIndex, visible) {\n    const mode = visible ? 'show' : 'hide';\n    const meta = this.getDatasetMeta(datasetIndex);\n    const anims = meta.controller._resolveAnimations(undefined, mode);\n    if (defined(dataIndex)) {\n      meta.data[dataIndex].hidden = !visible;\n      this.update();\n    } else {\n      this.setDatasetVisibility(datasetIndex, visible);\n      anims.update(meta, {visible});\n      this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n    }\n  }\n  hide(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, false);\n  }\n  show(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, true);\n  }\n  _destroyDatasetMeta(datasetIndex) {\n    const meta = this._metasets[datasetIndex];\n    if (meta && meta.controller) {\n      meta.controller._destroy();\n    }\n    delete this._metasets[datasetIndex];\n  }\n  _stop() {\n    let i, ilen;\n    this.stop();\n    animator.remove(this);\n    for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._destroyDatasetMeta(i);\n    }\n  }\n  destroy() {\n    this.notifyPlugins('beforeDestroy');\n    const {canvas, ctx} = this;\n    this._stop();\n    this.config.clearCache();\n    if (canvas) {\n      this.unbindEvents();\n      clearCanvas(canvas, ctx);\n      this.platform.releaseContext(ctx);\n      this.canvas = null;\n      this.ctx = null;\n    }\n    this.notifyPlugins('destroy');\n    delete instances[this.id];\n    this.notifyPlugins('afterDestroy');\n  }\n  toBase64Image(...args) {\n    return this.canvas.toDataURL(...args);\n  }\n  bindEvents() {\n    this.bindUserEvents();\n    if (this.options.responsive) {\n      this.bindResponsiveEvents();\n    } else {\n      this.attached = true;\n    }\n  }\n  bindUserEvents() {\n    const listeners = this._listeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const listener = (e, x, y) => {\n      e.offsetX = x;\n      e.offsetY = y;\n      this._eventHandler(e);\n    };\n    each(this.options.events, (type) => _add(type, listener));\n  }\n  bindResponsiveEvents() {\n    if (!this._responsiveListeners) {\n      this._responsiveListeners = {};\n    }\n    const listeners = this._responsiveListeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const _remove = (type, listener) => {\n      if (listeners[type]) {\n        platform.removeEventListener(this, type, listener);\n        delete listeners[type];\n      }\n    };\n    const listener = (width, height) => {\n      if (this.canvas) {\n        this.resize(width, height);\n      }\n    };\n    let detached;\n    const attached = () => {\n      _remove('attach', attached);\n      this.attached = true;\n      this.resize();\n      _add('resize', listener);\n      _add('detach', detached);\n    };\n    detached = () => {\n      this.attached = false;\n      _remove('resize', listener);\n      this._stop();\n      this._resize(0, 0);\n      _add('attach', attached);\n    };\n    if (platform.isAttached(this.canvas)) {\n      attached();\n    } else {\n      detached();\n    }\n  }\n  unbindEvents() {\n    each(this._listeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._listeners = {};\n    each(this._responsiveListeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._responsiveListeners = undefined;\n  }\n  updateHoverStyle(items, mode, enabled) {\n    const prefix = enabled ? 'set' : 'remove';\n    let meta, item, i, ilen;\n    if (mode === 'dataset') {\n      meta = this.getDatasetMeta(items[0].datasetIndex);\n      meta.controller['_' + prefix + 'DatasetHoverStyle']();\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      item = items[i];\n      const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n      if (controller) {\n        controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n      }\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements) {\n    const lastActive = this._active || [];\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('No dataset found at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed) {\n      this._active = active;\n      this._lastEvent = null;\n      this._updateHoverStyles(active, lastActive);\n    }\n  }\n  notifyPlugins(hook, args, filter) {\n    return this._plugins.notify(this, hook, args, filter);\n  }\n  _updateHoverStyles(active, lastActive, replay) {\n    const hoverOptions = this.options.hover;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n    const deactivated = diff(lastActive, active);\n    const activated = replay ? active : diff(active, lastActive);\n    if (deactivated.length) {\n      this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n    }\n    if (activated.length && hoverOptions.mode) {\n      this.updateHoverStyle(activated, hoverOptions.mode, true);\n    }\n  }\n  _eventHandler(e, replay) {\n    const args = {\n      event: e,\n      replay,\n      cancelable: true,\n      inChartArea: _isPointInArea(e, this.chartArea, this._minPadding)\n    };\n    const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n    if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n      return;\n    }\n    const changed = this._handleEvent(e, replay, args.inChartArea);\n    args.cancelable = false;\n    this.notifyPlugins('afterEvent', args, eventFilter);\n    if (changed || args.changed) {\n      this.render();\n    }\n    return this;\n  }\n  _handleEvent(e, replay, inChartArea) {\n    const {_active: lastActive = [], options} = this;\n    const useFinalPosition = replay;\n    const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n    const isClick = _isClickEvent(e);\n    const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n    if (inChartArea) {\n      this._lastEvent = null;\n      callback(options.onHover, [e, active, this], this);\n      if (isClick) {\n        callback(options.onClick, [e, active, this], this);\n      }\n    }\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed || replay) {\n      this._active = active;\n      this._updateHoverStyles(active, lastActive, replay);\n    }\n    this._lastEvent = lastEvent;\n    return changed;\n  }\n  _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const hoverOptions = this.options.hover;\n    return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n  }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n  defaults: {\n    enumerable,\n    value: defaults\n  },\n  instances: {\n    enumerable,\n    value: instances\n  },\n  overrides: {\n    enumerable,\n    value: overrides\n  },\n  registry: {\n    enumerable,\n    value: registry\n  },\n  version: {\n    enumerable,\n    value: version\n  },\n  getChart: {\n    enumerable,\n    value: getChart\n  },\n  register: {\n    enumerable,\n    value: (...items) => {\n      registry.add(...items);\n      invalidatePlugins();\n    }\n  },\n  unregister: {\n    enumerable,\n    value: (...items) => {\n      registry.remove(...items);\n      invalidatePlugins();\n    }\n  }\n});\n\nfunction clipArc(ctx, element, endAngle) {\n  const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n  let angleMargin = pixelMargin / outerRadius;\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n  if (innerRadius > pixelMargin) {\n    angleMargin = pixelMargin / innerRadius;\n    ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n  } else {\n    ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n  }\n  ctx.closePath();\n  ctx.clip();\n}\nfunction toRadiusCorners(value) {\n  return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n  const o = toRadiusCorners(arc.options.borderRadius);\n  const halfThickness = (outerRadius - innerRadius) / 2;\n  const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n  const computeOuterLimit = (val) => {\n    const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n    return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n  };\n  return {\n    outerStart: computeOuterLimit(o.outerStart),\n    outerEnd: computeOuterLimit(o.outerEnd),\n    innerStart: _limitValue(o.innerStart, 0, innerLimit),\n    innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n  };\n}\nfunction rThetaToXY(r, theta, x, y) {\n  return {\n    x: x + r * Math.cos(theta),\n    y: y + r * Math.sin(theta),\n  };\n}\nfunction pathArc(ctx, element, offset, spacing, end) {\n  const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n  const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n  const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n  let spacingOffset = 0;\n  const alpha = end - start;\n  if (spacing) {\n    const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n    const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n    const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n    const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n    spacingOffset = (alpha - adjustedAngle) / 2;\n  }\n  const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n  const angleOffset = (alpha - beta) / 2;\n  const startAngle = start + angleOffset + spacingOffset;\n  const endAngle = end - angleOffset - spacingOffset;\n  const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n  const outerStartAdjustedRadius = outerRadius - outerStart;\n  const outerEndAdjustedRadius = outerRadius - outerEnd;\n  const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n  const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n  const innerStartAdjustedRadius = innerRadius + innerStart;\n  const innerEndAdjustedRadius = innerRadius + innerEnd;\n  const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n  const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n  if (outerEnd > 0) {\n    const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n  }\n  const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n  ctx.lineTo(p4.x, p4.y);\n  if (innerEnd > 0) {\n    const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n  }\n  ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n  if (innerStart > 0) {\n    const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n  }\n  const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n  ctx.lineTo(p8.x, p8.y);\n  if (outerStart > 0) {\n    const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n  }\n  ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing) {\n  const {fullCircles, startAngle, circumference} = element;\n  let endAngle = element.endAngle;\n  if (fullCircles) {\n    pathArc(ctx, element, offset, spacing, startAngle + TAU);\n    for (let i = 0; i < fullCircles; ++i) {\n      ctx.fill();\n    }\n    if (!isNaN(circumference)) {\n      endAngle = startAngle + circumference % TAU;\n      if (circumference % TAU === 0) {\n        endAngle += TAU;\n      }\n    }\n  }\n  pathArc(ctx, element, offset, spacing, endAngle);\n  ctx.fill();\n  return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n  const {x, y, startAngle, pixelMargin, fullCircles} = element;\n  const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n  const innerRadius = element.innerRadius + pixelMargin;\n  let i;\n  if (inner) {\n    clipArc(ctx, element, startAngle + TAU);\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle) {\n  const {options} = element;\n  const {borderWidth, borderJoinStyle} = options;\n  const inner = options.borderAlign === 'inner';\n  if (!borderWidth) {\n    return;\n  }\n  if (inner) {\n    ctx.lineWidth = borderWidth * 2;\n    ctx.lineJoin = borderJoinStyle || 'round';\n  } else {\n    ctx.lineWidth = borderWidth;\n    ctx.lineJoin = borderJoinStyle || 'bevel';\n  }\n  if (element.fullCircles) {\n    drawFullCircleBorders(ctx, element, inner);\n  }\n  if (inner) {\n    clipArc(ctx, element, endAngle);\n  }\n  pathArc(ctx, element, offset, spacing, endAngle);\n  ctx.stroke();\n}\nclass ArcElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.circumference = undefined;\n    this.startAngle = undefined;\n    this.endAngle = undefined;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.pixelMargin = 0;\n    this.fullCircles = 0;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(chartX, chartY, useFinalPosition) {\n    const point = this.getProps(['x', 'y'], useFinalPosition);\n    const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n    const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference'\n    ], useFinalPosition);\n    const rAdjust = this.options.spacing / 2;\n    const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n    const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n    const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n    return (betweenAngles && withinRadius);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n      'x',\n      'y',\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference',\n    ], useFinalPosition);\n    const {offset, spacing} = this.options;\n    const halfAngle = (startAngle + endAngle) / 2;\n    const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n    return {\n      x: x + Math.cos(halfAngle) * halfRadius,\n      y: y + Math.sin(halfAngle) * halfRadius\n    };\n  }\n  tooltipPosition(useFinalPosition) {\n    return this.getCenterPoint(useFinalPosition);\n  }\n  draw(ctx) {\n    const {options, circumference} = this;\n    const offset = (options.offset || 0) / 2;\n    const spacing = (options.spacing || 0) / 2;\n    this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n    this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n    if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n      return;\n    }\n    ctx.save();\n    let radiusOffset = 0;\n    if (offset) {\n      radiusOffset = offset / 2;\n      const halfAngle = (this.startAngle + this.endAngle) / 2;\n      ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n      if (this.circumference >= PI) {\n        radiusOffset = offset;\n      }\n    }\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    const endAngle = drawArc(ctx, this, radiusOffset, spacing);\n    drawBorder(ctx, this, radiusOffset, spacing, endAngle);\n    ctx.restore();\n  }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n  borderAlign: 'center',\n  borderColor: '#fff',\n  borderJoinStyle: undefined,\n  borderRadius: 0,\n  borderWidth: 2,\n  offset: 0,\n  spacing: 0,\n  angle: undefined,\n};\nArcElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n  ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n  ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n  ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n  ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n  ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n  ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n  ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n  if (options.stepped) {\n    return _steppedLineTo;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierCurveTo;\n  }\n  return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n  const count = points.length;\n  const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n  const {start: segmentStart, end: segmentEnd} = segment;\n  const start = Math.max(paramsStart, segmentStart);\n  const end = Math.min(paramsEnd, segmentEnd);\n  const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n  return {\n    count,\n    start,\n    loop: segment.loop,\n    ilen: end < start && !outside ? count + end - start : end - start\n  };\n}\nfunction pathSegment(ctx, line, segment, params) {\n  const {points, options} = line;\n  const {count, start, loop, ilen} = pathVars(points, segment, params);\n  const lineMethod = getLineMethod(options);\n  let {move = true, reverse} = params || {};\n  let i, point, prev;\n  for (i = 0; i <= ilen; ++i) {\n    point = points[(start + (reverse ? ilen - i : i)) % count];\n    if (point.skip) {\n      continue;\n    } else if (move) {\n      ctx.moveTo(point.x, point.y);\n      move = false;\n    } else {\n      lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n    prev = point;\n  }\n  if (loop) {\n    point = points[(start + (reverse ? ilen : 0)) % count];\n    lineMethod(ctx, prev, point, reverse, options.stepped);\n  }\n  return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n  const points = line.points;\n  const {count, start, ilen} = pathVars(points, segment, params);\n  const {move = true, reverse} = params || {};\n  let avgX = 0;\n  let countX = 0;\n  let i, point, prevX, minY, maxY, lastY;\n  const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n  const drawX = () => {\n    if (minY !== maxY) {\n      ctx.lineTo(avgX, maxY);\n      ctx.lineTo(avgX, minY);\n      ctx.lineTo(avgX, lastY);\n    }\n  };\n  if (move) {\n    point = points[pointIndex(0)];\n    ctx.moveTo(point.x, point.y);\n  }\n  for (i = 0; i <= ilen; ++i) {\n    point = points[pointIndex(i)];\n    if (point.skip) {\n      continue;\n    }\n    const x = point.x;\n    const y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n      } else if (y > maxY) {\n        maxY = y;\n      }\n      avgX = (countX * avgX + x) / ++countX;\n    } else {\n      drawX();\n      ctx.lineTo(x, y);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n    }\n    lastY = y;\n  }\n  drawX();\n}\nfunction _getSegmentMethod(line) {\n  const opts = line.options;\n  const borderDash = opts.borderDash && opts.borderDash.length;\n  const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n  return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n  if (options.stepped) {\n    return _steppedInterpolation;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierInterpolation;\n  }\n  return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n  let path = line._path;\n  if (!path) {\n    path = line._path = new Path2D();\n    if (line.path(path, start, count)) {\n      path.closePath();\n    }\n  }\n  setStyle(ctx, line.options);\n  ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n  const {segments, options} = line;\n  const segmentMethod = _getSegmentMethod(line);\n  for (const segment of segments) {\n    setStyle(ctx, options, segment.style);\n    ctx.beginPath();\n    if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n      ctx.closePath();\n    }\n    ctx.stroke();\n  }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n  if (usePath2D && !line.options.segment) {\n    strokePathWithCache(ctx, line, start, count);\n  } else {\n    strokePathDirect(ctx, line, start, count);\n  }\n}\nclass LineElement extends Element {\n  constructor(cfg) {\n    super();\n    this.animated = true;\n    this.options = undefined;\n    this._chart = undefined;\n    this._loop = undefined;\n    this._fullLoop = undefined;\n    this._path = undefined;\n    this._points = undefined;\n    this._segments = undefined;\n    this._decimated = false;\n    this._pointsUpdated = false;\n    this._datasetIndex = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  updateControlPoints(chartArea, indexAxis) {\n    const options = this.options;\n    if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n      const loop = options.spanGaps ? this._loop : this._fullLoop;\n      _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n      this._pointsUpdated = true;\n    }\n  }\n  set points(points) {\n    this._points = points;\n    delete this._segments;\n    delete this._path;\n    this._pointsUpdated = false;\n  }\n  get points() {\n    return this._points;\n  }\n  get segments() {\n    return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n  }\n  first() {\n    const segments = this.segments;\n    const points = this.points;\n    return segments.length && points[segments[0].start];\n  }\n  last() {\n    const segments = this.segments;\n    const points = this.points;\n    const count = segments.length;\n    return count && points[segments[count - 1].end];\n  }\n  interpolate(point, property) {\n    const options = this.options;\n    const value = point[property];\n    const points = this.points;\n    const segments = _boundSegments(this, {property, start: value, end: value});\n    if (!segments.length) {\n      return;\n    }\n    const result = [];\n    const _interpolate = _getInterpolationMethod(options);\n    let i, ilen;\n    for (i = 0, ilen = segments.length; i < ilen; ++i) {\n      const {start, end} = segments[i];\n      const p1 = points[start];\n      const p2 = points[end];\n      if (p1 === p2) {\n        result.push(p1);\n        continue;\n      }\n      const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n      const interpolated = _interpolate(p1, p2, t, options.stepped);\n      interpolated[property] = point[property];\n      result.push(interpolated);\n    }\n    return result.length === 1 ? result[0] : result;\n  }\n  pathSegment(ctx, segment, params) {\n    const segmentMethod = _getSegmentMethod(this);\n    return segmentMethod(ctx, this, segment, params);\n  }\n  path(ctx, start, count) {\n    const segments = this.segments;\n    const segmentMethod = _getSegmentMethod(this);\n    let loop = this._loop;\n    start = start || 0;\n    count = count || (this.points.length - start);\n    for (const segment of segments) {\n      loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n    }\n    return !!loop;\n  }\n  draw(ctx, chartArea, start, count) {\n    const options = this.options || {};\n    const points = this.points || [];\n    if (points.length && options.borderWidth) {\n      ctx.save();\n      draw(ctx, this, start, count);\n      ctx.restore();\n    }\n    if (this.animated) {\n      this._pointsUpdated = false;\n      this._path = undefined;\n    }\n  }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderWidth: 3,\n  capBezierPoints: true,\n  cubicInterpolationMode: 'default',\n  fill: false,\n  spanGaps: false,\n  stepped: false,\n  tension: 0,\n};\nLineElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n  _scriptable: true,\n  _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n  const options = el.options;\n  const {[axis]: value} = el.getProps([axis], useFinalPosition);\n  return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.parsed = undefined;\n    this.skip = undefined;\n    this.stop = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const options = this.options;\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange$1(this, mouseX, 'x', useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange$1(this, mouseY, 'y', useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  size(options) {\n    options = options || this.options || {};\n    let radius = options.radius || 0;\n    radius = Math.max(radius, radius && options.hoverRadius || 0);\n    const borderWidth = radius && options.borderWidth || 0;\n    return (radius + borderWidth) * 2;\n  }\n  draw(ctx, area) {\n    const options = this.options;\n    if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n      return;\n    }\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.fillStyle = options.backgroundColor;\n    drawPoint(ctx, options, this.x, this.y);\n  }\n  getRange() {\n    const options = this.options || {};\n    return options.radius + options.hitRadius;\n  }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n  borderWidth: 1,\n  hitRadius: 1,\n  hoverBorderWidth: 1,\n  hoverRadius: 4,\n  pointStyle: 'circle',\n  radius: 3,\n  rotation: 0\n};\nPointElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n  const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n  let left, right, top, bottom, half;\n  if (bar.horizontal) {\n    half = height / 2;\n    left = Math.min(x, base);\n    right = Math.max(x, base);\n    top = y - half;\n    bottom = y + half;\n  } else {\n    half = width / 2;\n    left = x - half;\n    right = x + half;\n    top = Math.min(y, base);\n    bottom = Math.max(y, base);\n  }\n  return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n  return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n  const value = bar.options.borderWidth;\n  const skip = bar.borderSkipped;\n  const o = toTRBL(value);\n  return {\n    t: skipOrLimit(skip.top, o.top, 0, maxH),\n    r: skipOrLimit(skip.right, o.right, 0, maxW),\n    b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n    l: skipOrLimit(skip.left, o.left, 0, maxW)\n  };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n  const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n  const value = bar.options.borderRadius;\n  const o = toTRBLCorners(value);\n  const maxR = Math.min(maxW, maxH);\n  const skip = bar.borderSkipped;\n  const enableBorder = enableBorderRadius || isObject(value);\n  return {\n    topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n    topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n    bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n    bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n  };\n}\nfunction boundingRects(bar) {\n  const bounds = getBarBounds(bar);\n  const width = bounds.right - bounds.left;\n  const height = bounds.bottom - bounds.top;\n  const border = parseBorderWidth(bar, width / 2, height / 2);\n  const radius = parseBorderRadius(bar, width / 2, height / 2);\n  return {\n    outer: {\n      x: bounds.left,\n      y: bounds.top,\n      w: width,\n      h: height,\n      radius\n    },\n    inner: {\n      x: bounds.left + border.l,\n      y: bounds.top + border.t,\n      w: width - border.l - border.r,\n      h: height - border.t - border.b,\n      radius: {\n        topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n        topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n        bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n        bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n      }\n    }\n  };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n  const skipX = x === null;\n  const skipY = y === null;\n  const skipBoth = skipX && skipY;\n  const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n  return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n  return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n  ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n  const x = rect.x !== refRect.x ? -amount : 0;\n  const y = rect.y !== refRect.y ? -amount : 0;\n  const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n  const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n  return {\n    x: rect.x + x,\n    y: rect.y + y,\n    w: rect.w + w,\n    h: rect.h + h,\n    radius: rect.radius\n  };\n}\nclass BarElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.horizontal = undefined;\n    this.base = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.inflateAmount = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  draw(ctx) {\n    const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n    const {inner, outer} = boundingRects(this);\n    const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n    ctx.save();\n    if (outer.w !== inner.w || outer.h !== inner.h) {\n      ctx.beginPath();\n      addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n      ctx.clip();\n      addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n      ctx.fillStyle = borderColor;\n      ctx.fill('evenodd');\n    }\n    ctx.beginPath();\n    addRectPath(ctx, inflateRect(inner, inflateAmount));\n    ctx.fillStyle = backgroundColor;\n    ctx.fill();\n    ctx.restore();\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return inRange(this, mouseX, mouseY, useFinalPosition);\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange(this, mouseX, null, useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange(this, null, mouseY, useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n    return {\n      x: horizontal ? (x + base) / 2 : x,\n      y: horizontal ? y : (y + base) / 2\n    };\n  }\n  getRange(axis) {\n    return axis === 'x' ? this.width / 2 : this.height / 2;\n  }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n  borderSkipped: 'start',\n  borderWidth: 0,\n  borderRadius: 0,\n  inflateAmount: 'auto',\n  pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n  const samples = options.samples || availableWidth;\n  if (samples >= count) {\n    return data.slice(start, start + count);\n  }\n  const decimated = [];\n  const bucketWidth = (count - 2) / (samples - 2);\n  let sampledIndex = 0;\n  const endIndex = start + count - 1;\n  let a = start;\n  let i, maxAreaPoint, maxArea, area, nextA;\n  decimated[sampledIndex++] = data[a];\n  for (i = 0; i < samples - 2; i++) {\n    let avgX = 0;\n    let avgY = 0;\n    let j;\n    const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n    const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n    const avgRangeLength = avgRangeEnd - avgRangeStart;\n    for (j = avgRangeStart; j < avgRangeEnd; j++) {\n      avgX += data[j].x;\n      avgY += data[j].y;\n    }\n    avgX /= avgRangeLength;\n    avgY /= avgRangeLength;\n    const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n    const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n    const {x: pointAx, y: pointAy} = data[a];\n    maxArea = area = -1;\n    for (j = rangeOffs; j < rangeTo; j++) {\n      area = 0.5 * Math.abs(\n        (pointAx - avgX) * (data[j].y - pointAy) -\n        (pointAx - data[j].x) * (avgY - pointAy)\n      );\n      if (area > maxArea) {\n        maxArea = area;\n        maxAreaPoint = data[j];\n        nextA = j;\n      }\n    }\n    decimated[sampledIndex++] = maxAreaPoint;\n    a = nextA;\n  }\n  decimated[sampledIndex++] = data[endIndex];\n  return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n  let avgX = 0;\n  let countX = 0;\n  let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n  const decimated = [];\n  const endIndex = start + count - 1;\n  const xMin = data[start].x;\n  const xMax = data[endIndex].x;\n  const dx = xMax - xMin;\n  for (i = start; i < start + count; ++i) {\n    point = data[i];\n    x = (point.x - xMin) / dx * availableWidth;\n    y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n        minIndex = i;\n      } else if (y > maxY) {\n        maxY = y;\n        maxIndex = i;\n      }\n      avgX = (countX * avgX + point.x) / ++countX;\n    } else {\n      const lastIndex = i - 1;\n      if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n        const intermediateIndex1 = Math.min(minIndex, maxIndex);\n        const intermediateIndex2 = Math.max(minIndex, maxIndex);\n        if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex1],\n            x: avgX,\n          });\n        }\n        if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex2],\n            x: avgX\n          });\n        }\n      }\n      if (i > 0 && lastIndex !== startIndex) {\n        decimated.push(data[lastIndex]);\n      }\n      decimated.push(point);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n      minIndex = maxIndex = startIndex = i;\n    }\n  }\n  return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n  if (dataset._decimated) {\n    const data = dataset._data;\n    delete dataset._decimated;\n    delete dataset._data;\n    Object.defineProperty(dataset, 'data', {value: data});\n  }\n}\nfunction cleanDecimatedData(chart) {\n  chart.data.datasets.forEach((dataset) => {\n    cleanDecimatedDataset(dataset);\n  });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n  const pointCount = points.length;\n  let start = 0;\n  let count;\n  const {iScale} = meta;\n  const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n  if (minDefined) {\n    start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n  }\n  if (maxDefined) {\n    count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n  } else {\n    count = pointCount - start;\n  }\n  return {start, count};\n}\nvar plugin_decimation = {\n  id: 'decimation',\n  defaults: {\n    algorithm: 'min-max',\n    enabled: false,\n  },\n  beforeElementsUpdate: (chart, args, options) => {\n    if (!options.enabled) {\n      cleanDecimatedData(chart);\n      return;\n    }\n    const availableWidth = chart.width;\n    chart.data.datasets.forEach((dataset, datasetIndex) => {\n      const {_data, indexAxis} = dataset;\n      const meta = chart.getDatasetMeta(datasetIndex);\n      const data = _data || dataset.data;\n      if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n        return;\n      }\n      if (meta.type !== 'line') {\n        return;\n      }\n      const xAxis = chart.scales[meta.xAxisID];\n      if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n        return;\n      }\n      if (chart.options.parsing) {\n        return;\n      }\n      let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n      const threshold = options.threshold || 4 * availableWidth;\n      if (count <= threshold) {\n        cleanDecimatedDataset(dataset);\n        return;\n      }\n      if (isNullOrUndef(_data)) {\n        dataset._data = data;\n        delete dataset.data;\n        Object.defineProperty(dataset, 'data', {\n          configurable: true,\n          enumerable: true,\n          get: function() {\n            return this._decimated;\n          },\n          set: function(d) {\n            this._data = d;\n          }\n        });\n      }\n      let decimated;\n      switch (options.algorithm) {\n      case 'lttb':\n        decimated = lttbDecimation(data, start, count, availableWidth, options);\n        break;\n      case 'min-max':\n        decimated = minMaxDecimation(data, start, count, availableWidth);\n        break;\n      default:\n        throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n      }\n      dataset._decimated = decimated;\n    });\n  },\n  destroy(chart) {\n    cleanDecimatedData(chart);\n  }\n};\n\nfunction getLineByIndex(chart, index) {\n  const meta = chart.getDatasetMeta(index);\n  const visible = meta && chart.isDatasetVisible(index);\n  return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n  const options = line.options;\n  const fillOption = options.fill;\n  let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n  if (fill === undefined) {\n    fill = !!options.backgroundColor;\n  }\n  if (fill === false || fill === null) {\n    return false;\n  }\n  if (fill === true) {\n    return 'origin';\n  }\n  return fill;\n}\nfunction decodeFill(line, index, count) {\n  const fill = parseFillOption(line);\n  if (isObject(fill)) {\n    return isNaN(fill.value) ? false : fill;\n  }\n  let target = parseFloat(fill);\n  if (isNumberFinite(target) && Math.floor(target) === target) {\n    if (fill[0] === '-' || fill[0] === '+') {\n      target = index + target;\n    }\n    if (target === index || target < 0 || target >= count) {\n      return false;\n    }\n    return target;\n  }\n  return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n  const {scale = {}, fill} = source;\n  let target = null;\n  let horizontal;\n  if (fill === 'start') {\n    target = scale.bottom;\n  } else if (fill === 'end') {\n    target = scale.top;\n  } else if (isObject(fill)) {\n    target = scale.getPixelForValue(fill.value);\n  } else if (scale.getBasePixel) {\n    target = scale.getBasePixel();\n  }\n  if (isNumberFinite(target)) {\n    horizontal = scale.isHorizontal();\n    return {\n      x: horizontal ? target : null,\n      y: horizontal ? null : target\n    };\n  }\n  return null;\n}\nclass simpleArc {\n  constructor(opts) {\n    this.x = opts.x;\n    this.y = opts.y;\n    this.radius = opts.radius;\n  }\n  pathSegment(ctx, bounds, opts) {\n    const {x, y, radius} = this;\n    bounds = bounds || {start: 0, end: TAU};\n    ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n    return !opts.bounds;\n  }\n  interpolate(point) {\n    const {x, y, radius} = this;\n    const angle = point.angle;\n    return {\n      x: x + Math.cos(angle) * radius,\n      y: y + Math.sin(angle) * radius,\n      angle\n    };\n  }\n}\nfunction computeCircularBoundary(source) {\n  const {scale, fill} = source;\n  const options = scale.options;\n  const length = scale.getLabels().length;\n  const target = [];\n  const start = options.reverse ? scale.max : scale.min;\n  const end = options.reverse ? scale.min : scale.max;\n  let i, center, value;\n  if (fill === 'start') {\n    value = start;\n  } else if (fill === 'end') {\n    value = end;\n  } else if (isObject(fill)) {\n    value = fill.value;\n  } else {\n    value = scale.getBaseValue();\n  }\n  if (options.grid.circular) {\n    center = scale.getPointPositionForValue(0, start);\n    return new simpleArc({\n      x: center.x,\n      y: center.y,\n      radius: scale.getDistanceFromCenterForValue(value)\n    });\n  }\n  for (i = 0; i < length; ++i) {\n    target.push(scale.getPointPositionForValue(i, value));\n  }\n  return target;\n}\nfunction computeBoundary(source) {\n  const scale = source.scale || {};\n  if (scale.getPointPositionForValue) {\n    return computeCircularBoundary(source);\n  }\n  return computeLinearBoundary(source);\n}\nfunction findSegmentEnd(start, end, points) {\n  for (;end > start; end--) {\n    const point = points[end];\n    if (!isNaN(point.x) && !isNaN(point.y)) {\n      break;\n    }\n  }\n  return end;\n}\nfunction pointsFromSegments(boundary, line) {\n  const {x = null, y = null} = boundary || {};\n  const linePoints = line.points;\n  const points = [];\n  line.segments.forEach(({start, end}) => {\n    end = findSegmentEnd(start, end, linePoints);\n    const first = linePoints[start];\n    const last = linePoints[end];\n    if (y !== null) {\n      points.push({x: first.x, y});\n      points.push({x: last.x, y});\n    } else if (x !== null) {\n      points.push({x, y: first.y});\n      points.push({x, y: last.y});\n    }\n  });\n  return points;\n}\nfunction buildStackLine(source) {\n  const {scale, index, line} = source;\n  const points = [];\n  const segments = line.segments;\n  const sourcePoints = line.points;\n  const linesBelow = getLinesBelow(scale, index);\n  linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    for (let j = segment.start; j <= segment.end; j++) {\n      addPointsBelow(points, sourcePoints[j], linesBelow);\n    }\n  }\n  return new LineElement({points, options: {}});\n}\nfunction getLinesBelow(scale, index) {\n  const below = [];\n  const metas = scale.getMatchingVisibleMetas('line');\n  for (let i = 0; i < metas.length; i++) {\n    const meta = metas[i];\n    if (meta.index === index) {\n      break;\n    }\n    if (!meta.hidden) {\n      below.unshift(meta.dataset);\n    }\n  }\n  return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n  const postponed = [];\n  for (let j = 0; j < linesBelow.length; j++) {\n    const line = linesBelow[j];\n    const {first, last, point} = findPoint(line, sourcePoint, 'x');\n    if (!point || (first && last)) {\n      continue;\n    }\n    if (first) {\n      postponed.unshift(point);\n    } else {\n      points.push(point);\n      if (!last) {\n        break;\n      }\n    }\n  }\n  points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n  const point = line.interpolate(sourcePoint, property);\n  if (!point) {\n    return {};\n  }\n  const pointValue = point[property];\n  const segments = line.segments;\n  const linePoints = line.points;\n  let first = false;\n  let last = false;\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    const firstValue = linePoints[segment.start][property];\n    const lastValue = linePoints[segment.end][property];\n    if (_isBetween(pointValue, firstValue, lastValue)) {\n      first = pointValue === firstValue;\n      last = pointValue === lastValue;\n      break;\n    }\n  }\n  return {first, last, point};\n}\nfunction getTarget(source) {\n  const {chart, fill, line} = source;\n  if (isNumberFinite(fill)) {\n    return getLineByIndex(chart, fill);\n  }\n  if (fill === 'stack') {\n    return buildStackLine(source);\n  }\n  if (fill === 'shape') {\n    return true;\n  }\n  const boundary = computeBoundary(source);\n  if (boundary instanceof simpleArc) {\n    return boundary;\n  }\n  return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n  let points = [];\n  let _loop = false;\n  if (isArray(boundary)) {\n    _loop = true;\n    points = boundary;\n  } else {\n    points = pointsFromSegments(boundary, line);\n  }\n  return points.length ? new LineElement({\n    points,\n    options: {tension: 0},\n    _loop,\n    _fullLoop: _loop\n  }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n  const source = sources[index];\n  let fill = source.fill;\n  const visited = [index];\n  let target;\n  if (!propagate) {\n    return fill;\n  }\n  while (fill !== false && visited.indexOf(fill) === -1) {\n    if (!isNumberFinite(fill)) {\n      return fill;\n    }\n    target = sources[fill];\n    if (!target) {\n      return false;\n    }\n    if (target.visible) {\n      return fill;\n    }\n    visited.push(fill);\n    fill = target.fill;\n  }\n  return false;\n}\nfunction _clip(ctx, target, clipY) {\n  const {segments, points} = target;\n  let first = true;\n  let lineLoop = false;\n  ctx.beginPath();\n  for (const segment of segments) {\n    const {start, end} = segment;\n    const firstPoint = points[start];\n    const lastPoint = points[findSegmentEnd(start, end, points)];\n    if (first) {\n      ctx.moveTo(firstPoint.x, firstPoint.y);\n      first = false;\n    } else {\n      ctx.lineTo(firstPoint.x, clipY);\n      ctx.lineTo(firstPoint.x, firstPoint.y);\n    }\n    lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n    if (lineLoop) {\n      ctx.closePath();\n    } else {\n      ctx.lineTo(lastPoint.x, clipY);\n    }\n  }\n  ctx.lineTo(target.first().x, clipY);\n  ctx.closePath();\n  ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n  if (loop) {\n    return;\n  }\n  let start = first[property];\n  let end = last[property];\n  if (property === 'angle') {\n    start = _normalizeAngle(start);\n    end = _normalizeAngle(end);\n  }\n  return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n  if (a && b) {\n    return fn(a[prop], b[prop]);\n  }\n  return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n  const segments = line.segments;\n  const points = line.points;\n  const tpoints = target.points;\n  const parts = [];\n  for (const segment of segments) {\n    let {start, end} = segment;\n    end = findSegmentEnd(start, end, points);\n    const bounds = getBounds(property, points[start], points[end], segment.loop);\n    if (!target.segments) {\n      parts.push({\n        source: segment,\n        target: bounds,\n        start: points[start],\n        end: points[end]\n      });\n      continue;\n    }\n    const targetSegments = _boundSegments(target, bounds);\n    for (const tgt of targetSegments) {\n      const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n      const fillSources = _boundSegment(segment, points, subBounds);\n      for (const fillSource of fillSources) {\n        parts.push({\n          source: fillSource,\n          target: tgt,\n          start: {\n            [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n          },\n          end: {\n            [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n          }\n        });\n      }\n    }\n  }\n  return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n  const {top, bottom} = scale.chart.chartArea;\n  const {property, start, end} = bounds || {};\n  if (property === 'x') {\n    ctx.beginPath();\n    ctx.rect(start, top, end - start, bottom - top);\n    ctx.clip();\n  }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n  const interpolatedPoint = target.interpolate(point, property);\n  if (interpolatedPoint) {\n    ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n  }\n}\nfunction _fill(ctx, cfg) {\n  const {line, target, property, color, scale} = cfg;\n  const segments = _segments(line, target, property);\n  for (const {source: src, target: tgt, start, end} of segments) {\n    const {style: {backgroundColor = color} = {}} = src;\n    const notShape = target !== true;\n    ctx.save();\n    ctx.fillStyle = backgroundColor;\n    clipBounds(ctx, scale, notShape && getBounds(property, start, end));\n    ctx.beginPath();\n    const lineLoop = !!line.pathSegment(ctx, src);\n    let loop;\n    if (notShape) {\n      if (lineLoop) {\n        ctx.closePath();\n      } else {\n        interpolatedLineTo(ctx, target, end, property);\n      }\n      const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n      loop = lineLoop && targetLoop;\n      if (!loop) {\n        interpolatedLineTo(ctx, target, start, property);\n      }\n    }\n    ctx.closePath();\n    ctx.fill(loop ? 'evenodd' : 'nonzero');\n    ctx.restore();\n  }\n}\nfunction doFill(ctx, cfg) {\n  const {line, target, above, below, area, scale} = cfg;\n  const property = line._loop ? 'angle' : cfg.axis;\n  ctx.save();\n  if (property === 'x' && below !== above) {\n    _clip(ctx, target, area.top);\n    _fill(ctx, {line, target, color: above, scale, property});\n    ctx.restore();\n    ctx.save();\n    _clip(ctx, target, area.bottom);\n  }\n  _fill(ctx, {line, target, color: below, scale, property});\n  ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n  const target = getTarget(source);\n  const {line, scale, axis} = source;\n  const lineOpts = line.options;\n  const fillOption = lineOpts.fill;\n  const color = lineOpts.backgroundColor;\n  const {above = color, below = color} = fillOption || {};\n  if (target && line.points.length) {\n    clipArea(ctx, area);\n    doFill(ctx, {line, target, above, below, area, scale, axis});\n    unclipArea(ctx);\n  }\n}\nvar plugin_filler = {\n  id: 'filler',\n  afterDatasetsUpdate(chart, _args, options) {\n    const count = (chart.data.datasets || []).length;\n    const sources = [];\n    let meta, i, line, source;\n    for (i = 0; i < count; ++i) {\n      meta = chart.getDatasetMeta(i);\n      line = meta.dataset;\n      source = null;\n      if (line && line.options && line instanceof LineElement) {\n        source = {\n          visible: chart.isDatasetVisible(i),\n          index: i,\n          fill: decodeFill(line, i, count),\n          chart,\n          axis: meta.controller.options.indexAxis,\n          scale: meta.vScale,\n          line,\n        };\n      }\n      meta.$filler = source;\n      sources.push(source);\n    }\n    for (i = 0; i < count; ++i) {\n      source = sources[i];\n      if (!source || source.fill === false) {\n        continue;\n      }\n      source.fill = resolveTarget(sources, i, options.propagate);\n    }\n  },\n  beforeDraw(chart, _args, options) {\n    const draw = options.drawTime === 'beforeDraw';\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const area = chart.chartArea;\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (!source) {\n        continue;\n      }\n      source.line.updateControlPoints(area, source.axis);\n      if (draw) {\n        drawfill(chart.ctx, source, area);\n      }\n    }\n  },\n  beforeDatasetsDraw(chart, _args, options) {\n    if (options.drawTime !== 'beforeDatasetsDraw') {\n      return;\n    }\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (source) {\n        drawfill(chart.ctx, source, chart.chartArea);\n      }\n    }\n  },\n  beforeDatasetDraw(chart, args, options) {\n    const source = args.meta.$filler;\n    if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n      return;\n    }\n    drawfill(chart.ctx, source, chart.chartArea);\n  },\n  defaults: {\n    propagate: true,\n    drawTime: 'beforeDatasetDraw'\n  }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n  let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n  if (labelOpts.usePointStyle) {\n    boxHeight = Math.min(boxHeight, fontSize);\n    boxWidth = Math.min(boxWidth, fontSize);\n  }\n  return {\n    boxWidth,\n    boxHeight,\n    itemHeight: Math.max(fontSize, boxHeight)\n  };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n  constructor(config) {\n    super();\n    this._added = false;\n    this.legendHitBoxes = [];\n    this._hoveredItem = null;\n    this.doughnutMode = false;\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this.legendItems = undefined;\n    this.columnSizes = undefined;\n    this.lineWidths = undefined;\n    this.maxHeight = undefined;\n    this.maxWidth = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this._margins = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight, margins) {\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins;\n    this.setDimensions();\n    this.buildLabels();\n    this.fit();\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = this._margins.left;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = this._margins.top;\n      this.bottom = this.height;\n    }\n  }\n  buildLabels() {\n    const labelOpts = this.options.labels || {};\n    let legendItems = callback(labelOpts.generateLabels, [this.chart], this) || [];\n    if (labelOpts.filter) {\n      legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n    }\n    if (labelOpts.sort) {\n      legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n    }\n    if (this.options.reverse) {\n      legendItems.reverse();\n    }\n    this.legendItems = legendItems;\n  }\n  fit() {\n    const {options, ctx} = this;\n    if (!options.display) {\n      this.width = this.height = 0;\n      return;\n    }\n    const labelOpts = options.labels;\n    const labelFont = toFont(labelOpts.font);\n    const fontSize = labelFont.size;\n    const titleHeight = this._computeTitleHeight();\n    const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n    let width, height;\n    ctx.font = labelFont.string;\n    if (this.isHorizontal()) {\n      width = this.maxWidth;\n      height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    } else {\n      height = this.maxHeight;\n      width = this._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    }\n    this.width = Math.min(width, options.maxWidth || this.maxWidth);\n    this.height = Math.min(height, options.maxHeight || this.maxHeight);\n  }\n  _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxWidth, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const lineWidths = this.lineWidths = [0];\n    const lineHeight = itemHeight + padding;\n    let totalHeight = titleHeight;\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    let row = -1;\n    let top = -lineHeight;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n        totalHeight += lineHeight;\n        lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n        top += lineHeight;\n        row++;\n      }\n      hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n      lineWidths[lineWidths.length - 1] += itemWidth + padding;\n    });\n    return totalHeight;\n  }\n  _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxHeight, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const columnSizes = this.columnSizes = [];\n    const heightLimit = maxHeight - titleHeight;\n    let totalWidth = padding;\n    let currentColWidth = 0;\n    let currentColHeight = 0;\n    let left = 0;\n    let col = 0;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n        totalWidth += currentColWidth + padding;\n        columnSizes.push({width: currentColWidth, height: currentColHeight});\n        left += currentColWidth + padding;\n        col++;\n        currentColWidth = currentColHeight = 0;\n      }\n      hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n      currentColWidth = Math.max(currentColWidth, itemWidth);\n      currentColHeight += itemHeight + padding;\n    });\n    totalWidth += currentColWidth;\n    columnSizes.push({width: currentColWidth, height: currentColHeight});\n    return totalWidth;\n  }\n  adjustHitBoxes() {\n    if (!this.options.display) {\n      return;\n    }\n    const titleHeight = this._computeTitleHeight();\n    const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n    const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n    if (this.isHorizontal()) {\n      let row = 0;\n      let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n      for (const hitbox of hitboxes) {\n        if (row !== hitbox.row) {\n          row = hitbox.row;\n          left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n        }\n        hitbox.top += this.top + titleHeight + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n        left += hitbox.width + padding;\n      }\n    } else {\n      let col = 0;\n      let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n      for (const hitbox of hitboxes) {\n        if (hitbox.col !== col) {\n          col = hitbox.col;\n          top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n        }\n        hitbox.top = top;\n        hitbox.left += this.left + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n        top += hitbox.height + padding;\n      }\n    }\n  }\n  isHorizontal() {\n    return this.options.position === 'top' || this.options.position === 'bottom';\n  }\n  draw() {\n    if (this.options.display) {\n      const ctx = this.ctx;\n      clipArea(ctx, this);\n      this._draw();\n      unclipArea(ctx);\n    }\n  }\n  _draw() {\n    const {options: opts, columnSizes, lineWidths, ctx} = this;\n    const {align, labels: labelOpts} = opts;\n    const defaultColor = defaults.color;\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const labelFont = toFont(labelOpts.font);\n    const {color: fontColor, padding} = labelOpts;\n    const fontSize = labelFont.size;\n    const halfFontSize = fontSize / 2;\n    let cursor;\n    this.drawTitle();\n    ctx.textAlign = rtlHelper.textAlign('left');\n    ctx.textBaseline = 'middle';\n    ctx.lineWidth = 0.5;\n    ctx.font = labelFont.string;\n    const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n    const drawLegendBox = function(x, y, legendItem) {\n      if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n        return;\n      }\n      ctx.save();\n      const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n      ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n      ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n      ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n      ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n      ctx.lineWidth = lineWidth;\n      ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n      ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n      if (labelOpts.usePointStyle) {\n        const drawOptions = {\n          radius: boxWidth * Math.SQRT2 / 2,\n          pointStyle: legendItem.pointStyle,\n          rotation: legendItem.rotation,\n          borderWidth: lineWidth\n        };\n        const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n        const centerY = y + halfFontSize;\n        drawPoint(ctx, drawOptions, centerX, centerY);\n      } else {\n        const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n        const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n        const borderRadius = toTRBLCorners(legendItem.borderRadius);\n        ctx.beginPath();\n        if (Object.values(borderRadius).some(v => v !== 0)) {\n          addRoundedRectPath(ctx, {\n            x: xBoxLeft,\n            y: yBoxTop,\n            w: boxWidth,\n            h: boxHeight,\n            radius: borderRadius,\n          });\n        } else {\n          ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n        }\n        ctx.fill();\n        if (lineWidth !== 0) {\n          ctx.stroke();\n        }\n      }\n      ctx.restore();\n    };\n    const fillText = function(x, y, legendItem) {\n      renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n        strikethrough: legendItem.hidden,\n        textAlign: rtlHelper.textAlign(legendItem.textAlign)\n      });\n    };\n    const isHorizontal = this.isHorizontal();\n    const titleHeight = this._computeTitleHeight();\n    if (isHorizontal) {\n      cursor = {\n        x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n        y: this.top + padding + titleHeight,\n        line: 0\n      };\n    } else {\n      cursor = {\n        x: this.left + padding,\n        y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n        line: 0\n      };\n    }\n    overrideTextDirection(this.ctx, opts.textDirection);\n    const lineHeight = itemHeight + padding;\n    this.legendItems.forEach((legendItem, i) => {\n      ctx.strokeStyle = legendItem.fontColor || fontColor;\n      ctx.fillStyle = legendItem.fontColor || fontColor;\n      const textWidth = ctx.measureText(legendItem.text).width;\n      const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n      const width = boxWidth + halfFontSize + textWidth;\n      let x = cursor.x;\n      let y = cursor.y;\n      rtlHelper.setWidth(this.width);\n      if (isHorizontal) {\n        if (i > 0 && x + width + padding > this.right) {\n          y = cursor.y += lineHeight;\n          cursor.line++;\n          x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n        }\n      } else if (i > 0 && y + lineHeight > this.bottom) {\n        x = cursor.x = x + columnSizes[cursor.line].width + padding;\n        cursor.line++;\n        y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n      }\n      const realX = rtlHelper.x(x);\n      drawLegendBox(realX, y, legendItem);\n      x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n      fillText(rtlHelper.x(x), y, legendItem);\n      if (isHorizontal) {\n        cursor.x += width + padding;\n      } else {\n        cursor.y += lineHeight;\n      }\n    });\n    restoreTextDirection(this.ctx, opts.textDirection);\n  }\n  drawTitle() {\n    const opts = this.options;\n    const titleOpts = opts.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    if (!titleOpts.display) {\n      return;\n    }\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const ctx = this.ctx;\n    const position = titleOpts.position;\n    const halfFontSize = titleFont.size / 2;\n    const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n    let y;\n    let left = this.left;\n    let maxWidth = this.width;\n    if (this.isHorizontal()) {\n      maxWidth = Math.max(...this.lineWidths);\n      y = this.top + topPaddingPlusHalfFontSize;\n      left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n    } else {\n      const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n      y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n    }\n    const x = _alignStartEnd(position, left, left + maxWidth);\n    ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n    ctx.textBaseline = 'middle';\n    ctx.strokeStyle = titleOpts.color;\n    ctx.fillStyle = titleOpts.color;\n    ctx.font = titleFont.string;\n    renderText(ctx, titleOpts.text, x, y, titleFont);\n  }\n  _computeTitleHeight() {\n    const titleOpts = this.options.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n  }\n  _getLegendItemAt(x, y) {\n    let i, hitBox, lh;\n    if (_isBetween(x, this.left, this.right)\n      && _isBetween(y, this.top, this.bottom)) {\n      lh = this.legendHitBoxes;\n      for (i = 0; i < lh.length; ++i) {\n        hitBox = lh[i];\n        if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n          && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n          return this.legendItems[i];\n        }\n      }\n    }\n    return null;\n  }\n  handleEvent(e) {\n    const opts = this.options;\n    if (!isListened(e.type, opts)) {\n      return;\n    }\n    const hoveredItem = this._getLegendItemAt(e.x, e.y);\n    if (e.type === 'mousemove') {\n      const previous = this._hoveredItem;\n      const sameItem = itemsEqual(previous, hoveredItem);\n      if (previous && !sameItem) {\n        callback(opts.onLeave, [e, previous, this], this);\n      }\n      this._hoveredItem = hoveredItem;\n      if (hoveredItem && !sameItem) {\n        callback(opts.onHover, [e, hoveredItem, this], this);\n      }\n    } else if (hoveredItem) {\n      callback(opts.onClick, [e, hoveredItem, this], this);\n    }\n  }\n}\nfunction isListened(type, opts) {\n  if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n    return true;\n  }\n  if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n    return true;\n  }\n  return false;\n}\nvar plugin_legend = {\n  id: 'legend',\n  _element: Legend,\n  start(chart, _args, options) {\n    const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n    layouts.configure(chart, legend, options);\n    layouts.addBox(chart, legend);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, chart.legend);\n    delete chart.legend;\n  },\n  beforeUpdate(chart, _args, options) {\n    const legend = chart.legend;\n    layouts.configure(chart, legend, options);\n    legend.options = options;\n  },\n  afterUpdate(chart) {\n    const legend = chart.legend;\n    legend.buildLabels();\n    legend.adjustHitBoxes();\n  },\n  afterEvent(chart, args) {\n    if (!args.replay) {\n      chart.legend.handleEvent(args.event);\n    }\n  },\n  defaults: {\n    display: true,\n    position: 'top',\n    align: 'center',\n    fullSize: true,\n    reverse: false,\n    weight: 1000,\n    onClick(e, legendItem, legend) {\n      const index = legendItem.datasetIndex;\n      const ci = legend.chart;\n      if (ci.isDatasetVisible(index)) {\n        ci.hide(index);\n        legendItem.hidden = true;\n      } else {\n        ci.show(index);\n        legendItem.hidden = false;\n      }\n    },\n    onHover: null,\n    onLeave: null,\n    labels: {\n      color: (ctx) => ctx.chart.options.color,\n      boxWidth: 40,\n      padding: 10,\n      generateLabels(chart) {\n        const datasets = chart.data.datasets;\n        const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n        return chart._getSortedDatasetMetas().map((meta) => {\n          const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n          const borderWidth = toPadding(style.borderWidth);\n          return {\n            text: datasets[meta.index].label,\n            fillStyle: style.backgroundColor,\n            fontColor: color,\n            hidden: !meta.visible,\n            lineCap: style.borderCapStyle,\n            lineDash: style.borderDash,\n            lineDashOffset: style.borderDashOffset,\n            lineJoin: style.borderJoinStyle,\n            lineWidth: (borderWidth.width + borderWidth.height) / 4,\n            strokeStyle: style.borderColor,\n            pointStyle: pointStyle || style.pointStyle,\n            rotation: style.rotation,\n            textAlign: textAlign || style.textAlign,\n            borderRadius: 0,\n            datasetIndex: meta.index\n          };\n        }, this);\n      }\n    },\n    title: {\n      color: (ctx) => ctx.chart.options.color,\n      display: false,\n      position: 'center',\n      text: '',\n    }\n  },\n  descriptors: {\n    _scriptable: (name) => !name.startsWith('on'),\n    labels: {\n      _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n    }\n  },\n};\n\nclass Title extends Element {\n  constructor(config) {\n    super();\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this._padding = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight) {\n    const opts = this.options;\n    this.left = 0;\n    this.top = 0;\n    if (!opts.display) {\n      this.width = this.height = this.right = this.bottom = 0;\n      return;\n    }\n    this.width = this.right = maxWidth;\n    this.height = this.bottom = maxHeight;\n    const lineCount = isArray(opts.text) ? opts.text.length : 1;\n    this._padding = toPadding(opts.padding);\n    const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n    if (this.isHorizontal()) {\n      this.height = textSize;\n    } else {\n      this.width = textSize;\n    }\n  }\n  isHorizontal() {\n    const pos = this.options.position;\n    return pos === 'top' || pos === 'bottom';\n  }\n  _drawArgs(offset) {\n    const {top, left, bottom, right, options} = this;\n    const align = options.align;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n    if (this.isHorizontal()) {\n      titleX = _alignStartEnd(align, left, right);\n      titleY = top + offset;\n      maxWidth = right - left;\n    } else {\n      if (options.position === 'left') {\n        titleX = left + offset;\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = PI * -0.5;\n      } else {\n        titleX = right - offset;\n        titleY = _alignStartEnd(align, top, bottom);\n        rotation = PI * 0.5;\n      }\n      maxWidth = bottom - top;\n    }\n    return {titleX, titleY, maxWidth, rotation};\n  }\n  draw() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    if (!opts.display) {\n      return;\n    }\n    const fontOpts = toFont(opts.font);\n    const lineHeight = fontOpts.lineHeight;\n    const offset = lineHeight / 2 + this._padding.top;\n    const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n    renderText(ctx, opts.text, 0, 0, fontOpts, {\n      color: opts.color,\n      maxWidth,\n      rotation,\n      textAlign: _toLeftRightCenter(opts.align),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n}\nfunction createTitle(chart, titleOpts) {\n  const title = new Title({\n    ctx: chart.ctx,\n    options: titleOpts,\n    chart\n  });\n  layouts.configure(chart, title, titleOpts);\n  layouts.addBox(chart, title);\n  chart.titleBlock = title;\n}\nvar plugin_title = {\n  id: 'title',\n  _element: Title,\n  start(chart, _args, options) {\n    createTitle(chart, options);\n  },\n  stop(chart) {\n    const titleBlock = chart.titleBlock;\n    layouts.removeBox(chart, titleBlock);\n    delete chart.titleBlock;\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = chart.titleBlock;\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'bold',\n    },\n    fullSize: true,\n    padding: 10,\n    position: 'top',\n    text: '',\n    weight: 2000\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n  id: 'subtitle',\n  start(chart, _args, options) {\n    const title = new Title({\n      ctx: chart.ctx,\n      options,\n      chart\n    });\n    layouts.configure(chart, title, options);\n    layouts.addBox(chart, title);\n    map.set(chart, title);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, map.get(chart));\n    map.delete(chart);\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = map.get(chart);\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'normal',\n    },\n    fullSize: true,\n    padding: 0,\n    position: 'top',\n    text: '',\n    weight: 1500\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst positioners = {\n  average(items) {\n    if (!items.length) {\n      return false;\n    }\n    let i, len;\n    let x = 0;\n    let y = 0;\n    let count = 0;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const pos = el.tooltipPosition();\n        x += pos.x;\n        y += pos.y;\n        ++count;\n      }\n    }\n    return {\n      x: x / count,\n      y: y / count\n    };\n  },\n  nearest(items, eventPosition) {\n    if (!items.length) {\n      return false;\n    }\n    let x = eventPosition.x;\n    let y = eventPosition.y;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let i, len, nearestElement;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const center = el.getCenterPoint();\n        const d = distanceBetweenPoints(eventPosition, center);\n        if (d < minDistance) {\n          minDistance = d;\n          nearestElement = el;\n        }\n      }\n    }\n    if (nearestElement) {\n      const tp = nearestElement.tooltipPosition();\n      x = tp.x;\n      y = tp.y;\n    }\n    return {\n      x,\n      y\n    };\n  }\n};\nfunction pushOrConcat(base, toPush) {\n  if (toPush) {\n    if (isArray(toPush)) {\n      Array.prototype.push.apply(base, toPush);\n    } else {\n      base.push(toPush);\n    }\n  }\n  return base;\n}\nfunction splitNewlines(str) {\n  if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n    return str.split('\\n');\n  }\n  return str;\n}\nfunction createTooltipItem(chart, item) {\n  const {element, datasetIndex, index} = item;\n  const controller = chart.getDatasetMeta(datasetIndex).controller;\n  const {label, value} = controller.getLabelAndValue(index);\n  return {\n    chart,\n    label,\n    parsed: controller.getParsed(index),\n    raw: chart.data.datasets[datasetIndex].data[index],\n    formattedValue: value,\n    dataset: controller.getDataset(),\n    dataIndex: index,\n    datasetIndex,\n    element\n  };\n}\nfunction getTooltipSize(tooltip, options) {\n  const ctx = tooltip.chart.ctx;\n  const {body, footer, title} = tooltip;\n  const {boxWidth, boxHeight} = options;\n  const bodyFont = toFont(options.bodyFont);\n  const titleFont = toFont(options.titleFont);\n  const footerFont = toFont(options.footerFont);\n  const titleLineCount = title.length;\n  const footerLineCount = footer.length;\n  const bodyLineItemCount = body.length;\n  const padding = toPadding(options.padding);\n  let height = padding.height;\n  let width = 0;\n  let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n  combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n  if (titleLineCount) {\n    height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n  }\n  if (combinedBodyLength) {\n    const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n    height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n  }\n  if (footerLineCount) {\n    height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n  }\n  let widthPadding = 0;\n  const maxLineWidth = function(line) {\n    width = Math.max(width, ctx.measureText(line).width + widthPadding);\n  };\n  ctx.save();\n  ctx.font = titleFont.string;\n  each(tooltip.title, maxLineWidth);\n  ctx.font = bodyFont.string;\n  each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n  widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n  each(body, (bodyItem) => {\n    each(bodyItem.before, maxLineWidth);\n    each(bodyItem.lines, maxLineWidth);\n    each(bodyItem.after, maxLineWidth);\n  });\n  widthPadding = 0;\n  ctx.font = footerFont.string;\n  each(tooltip.footer, maxLineWidth);\n  ctx.restore();\n  width += padding.width;\n  return {width, height};\n}\nfunction determineYAlign(chart, size) {\n  const {y, height} = size;\n  if (y < height / 2) {\n    return 'top';\n  } else if (y > (chart.height - height / 2)) {\n    return 'bottom';\n  }\n  return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n  const {x, width} = size;\n  const caret = options.caretSize + options.caretPadding;\n  if (xAlign === 'left' && x + width + caret > chart.width) {\n    return true;\n  }\n  if (xAlign === 'right' && x - width - caret < 0) {\n    return true;\n  }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n  const {x, width} = size;\n  const {width: chartWidth, chartArea: {left, right}} = chart;\n  let xAlign = 'center';\n  if (yAlign === 'center') {\n    xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n  } else if (x <= width / 2) {\n    xAlign = 'left';\n  } else if (x >= chartWidth - width / 2) {\n    xAlign = 'right';\n  }\n  if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n    xAlign = 'center';\n  }\n  return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n  const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n  return {\n    xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n    yAlign\n  };\n}\nfunction alignX(size, xAlign) {\n  let {x, width} = size;\n  if (xAlign === 'right') {\n    x -= width;\n  } else if (xAlign === 'center') {\n    x -= (width / 2);\n  }\n  return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n  let {y, height} = size;\n  if (yAlign === 'top') {\n    y += paddingAndSize;\n  } else if (yAlign === 'bottom') {\n    y -= height + paddingAndSize;\n  } else {\n    y -= (height / 2);\n  }\n  return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n  const {caretSize, caretPadding, cornerRadius} = options;\n  const {xAlign, yAlign} = alignment;\n  const paddingAndSize = caretSize + caretPadding;\n  const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n  let x = alignX(size, xAlign);\n  const y = alignY(size, yAlign, paddingAndSize);\n  if (yAlign === 'center') {\n    if (xAlign === 'left') {\n      x += paddingAndSize;\n    } else if (xAlign === 'right') {\n      x -= paddingAndSize;\n    }\n  } else if (xAlign === 'left') {\n    x -= Math.max(topLeft, bottomLeft) + caretSize;\n  } else if (xAlign === 'right') {\n    x += Math.max(topRight, bottomRight) + caretSize;\n  }\n  return {\n    x: _limitValue(x, 0, chart.width - size.width),\n    y: _limitValue(y, 0, chart.height - size.height)\n  };\n}\nfunction getAlignedX(tooltip, align, options) {\n  const padding = toPadding(options.padding);\n  return align === 'center'\n    ? tooltip.x + tooltip.width / 2\n    : align === 'right'\n      ? tooltip.x + tooltip.width - padding.right\n      : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n  return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n  return createContext(parent, {\n    tooltip,\n    tooltipItems,\n    type: 'tooltip'\n  });\n}\nfunction overrideCallbacks(callbacks, context) {\n  const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n  return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n  constructor(config) {\n    super();\n    this.opacity = 0;\n    this._active = [];\n    this._eventPosition = undefined;\n    this._size = undefined;\n    this._cachedAnimations = undefined;\n    this._tooltipItems = [];\n    this.$animations = undefined;\n    this.$context = undefined;\n    this.chart = config.chart || config._chart;\n    this._chart = this.chart;\n    this.options = config.options;\n    this.dataPoints = undefined;\n    this.title = undefined;\n    this.beforeBody = undefined;\n    this.body = undefined;\n    this.afterBody = undefined;\n    this.footer = undefined;\n    this.xAlign = undefined;\n    this.yAlign = undefined;\n    this.x = undefined;\n    this.y = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this.caretX = undefined;\n    this.caretY = undefined;\n    this.labelColors = undefined;\n    this.labelPointStyles = undefined;\n    this.labelTextColors = undefined;\n  }\n  initialize(options) {\n    this.options = options;\n    this._cachedAnimations = undefined;\n    this.$context = undefined;\n  }\n  _resolveAnimations() {\n    const cached = this._cachedAnimations;\n    if (cached) {\n      return cached;\n    }\n    const chart = this.chart;\n    const options = this.options.setContext(this.getContext());\n    const opts = options.enabled && chart.options.animation && options.animations;\n    const animations = new Animations(this.chart, opts);\n    if (opts._cacheable) {\n      this._cachedAnimations = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getContext() {\n    return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n  }\n  getTitle(context, options) {\n    const {callbacks} = options;\n    const beforeTitle = callbacks.beforeTitle.apply(this, [context]);\n    const title = callbacks.title.apply(this, [context]);\n    const afterTitle = callbacks.afterTitle.apply(this, [context]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n    lines = pushOrConcat(lines, splitNewlines(title));\n    lines = pushOrConcat(lines, splitNewlines(afterTitle));\n    return lines;\n  }\n  getBeforeBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n  }\n  getBody(tooltipItems, options) {\n    const {callbacks} = options;\n    const bodyItems = [];\n    each(tooltipItems, (context) => {\n      const bodyItem = {\n        before: [],\n        lines: [],\n        after: []\n      };\n      const scoped = overrideCallbacks(callbacks, context);\n      pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(this, context)));\n      pushOrConcat(bodyItem.lines, scoped.label.call(this, context));\n      pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(this, context)));\n      bodyItems.push(bodyItem);\n    });\n    return bodyItems;\n  }\n  getAfterBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n  }\n  getFooter(tooltipItems, options) {\n    const {callbacks} = options;\n    const beforeFooter = callbacks.beforeFooter.apply(this, [tooltipItems]);\n    const footer = callbacks.footer.apply(this, [tooltipItems]);\n    const afterFooter = callbacks.afterFooter.apply(this, [tooltipItems]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n    lines = pushOrConcat(lines, splitNewlines(footer));\n    lines = pushOrConcat(lines, splitNewlines(afterFooter));\n    return lines;\n  }\n  _createItems(options) {\n    const active = this._active;\n    const data = this.chart.data;\n    const labelColors = [];\n    const labelPointStyles = [];\n    const labelTextColors = [];\n    let tooltipItems = [];\n    let i, len;\n    for (i = 0, len = active.length; i < len; ++i) {\n      tooltipItems.push(createTooltipItem(this.chart, active[i]));\n    }\n    if (options.filter) {\n      tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n    }\n    if (options.itemSort) {\n      tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n    }\n    each(tooltipItems, (context) => {\n      const scoped = overrideCallbacks(options.callbacks, context);\n      labelColors.push(scoped.labelColor.call(this, context));\n      labelPointStyles.push(scoped.labelPointStyle.call(this, context));\n      labelTextColors.push(scoped.labelTextColor.call(this, context));\n    });\n    this.labelColors = labelColors;\n    this.labelPointStyles = labelPointStyles;\n    this.labelTextColors = labelTextColors;\n    this.dataPoints = tooltipItems;\n    return tooltipItems;\n  }\n  update(changed, replay) {\n    const options = this.options.setContext(this.getContext());\n    const active = this._active;\n    let properties;\n    let tooltipItems = [];\n    if (!active.length) {\n      if (this.opacity !== 0) {\n        properties = {\n          opacity: 0\n        };\n      }\n    } else {\n      const position = positioners[options.position].call(this, active, this._eventPosition);\n      tooltipItems = this._createItems(options);\n      this.title = this.getTitle(tooltipItems, options);\n      this.beforeBody = this.getBeforeBody(tooltipItems, options);\n      this.body = this.getBody(tooltipItems, options);\n      this.afterBody = this.getAfterBody(tooltipItems, options);\n      this.footer = this.getFooter(tooltipItems, options);\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, size);\n      const alignment = determineAlignment(this.chart, options, positionAndSize);\n      const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n      this.xAlign = alignment.xAlign;\n      this.yAlign = alignment.yAlign;\n      properties = {\n        opacity: 1,\n        x: backgroundPoint.x,\n        y: backgroundPoint.y,\n        width: size.width,\n        height: size.height,\n        caretX: position.x,\n        caretY: position.y\n      };\n    }\n    this._tooltipItems = tooltipItems;\n    this.$context = undefined;\n    if (properties) {\n      this._resolveAnimations().update(this, properties);\n    }\n    if (changed && options.external) {\n      options.external.call(this, {chart: this.chart, tooltip: this, replay});\n    }\n  }\n  drawCaret(tooltipPoint, ctx, size, options) {\n    const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n    ctx.lineTo(caretPosition.x1, caretPosition.y1);\n    ctx.lineTo(caretPosition.x2, caretPosition.y2);\n    ctx.lineTo(caretPosition.x3, caretPosition.y3);\n  }\n  getCaretPosition(tooltipPoint, size, options) {\n    const {xAlign, yAlign} = this;\n    const {caretSize, cornerRadius} = options;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n    const {x: ptX, y: ptY} = tooltipPoint;\n    const {width, height} = size;\n    let x1, x2, x3, y1, y2, y3;\n    if (yAlign === 'center') {\n      y2 = ptY + (height / 2);\n      if (xAlign === 'left') {\n        x1 = ptX;\n        x2 = x1 - caretSize;\n        y1 = y2 + caretSize;\n        y3 = y2 - caretSize;\n      } else {\n        x1 = ptX + width;\n        x2 = x1 + caretSize;\n        y1 = y2 - caretSize;\n        y3 = y2 + caretSize;\n      }\n      x3 = x1;\n    } else {\n      if (xAlign === 'left') {\n        x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n      } else if (xAlign === 'right') {\n        x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n      } else {\n        x2 = this.caretX;\n      }\n      if (yAlign === 'top') {\n        y1 = ptY;\n        y2 = y1 - caretSize;\n        x1 = x2 - caretSize;\n        x3 = x2 + caretSize;\n      } else {\n        y1 = ptY + height;\n        y2 = y1 + caretSize;\n        x1 = x2 + caretSize;\n        x3 = x2 - caretSize;\n      }\n      y3 = y1;\n    }\n    return {x1, x2, x3, y1, y2, y3};\n  }\n  drawTitle(pt, ctx, options) {\n    const title = this.title;\n    const length = title.length;\n    let titleFont, titleSpacing, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.titleAlign, options);\n      ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n      ctx.textBaseline = 'middle';\n      titleFont = toFont(options.titleFont);\n      titleSpacing = options.titleSpacing;\n      ctx.fillStyle = options.titleColor;\n      ctx.font = titleFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n        pt.y += titleFont.lineHeight + titleSpacing;\n        if (i + 1 === length) {\n          pt.y += options.titleMarginBottom - titleSpacing;\n        }\n      }\n    }\n  }\n  _drawColorBox(ctx, pt, i, rtlHelper, options) {\n    const labelColors = this.labelColors[i];\n    const labelPointStyle = this.labelPointStyles[i];\n    const {boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    const colorX = getAlignedX(this, 'left', options);\n    const rtlColorX = rtlHelper.x(colorX);\n    const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n    const colorY = pt.y + yOffSet;\n    if (options.usePointStyle) {\n      const drawOptions = {\n        radius: Math.min(boxWidth, boxHeight) / 2,\n        pointStyle: labelPointStyle.pointStyle,\n        rotation: labelPointStyle.rotation,\n        borderWidth: 1\n      };\n      const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n      const centerY = colorY + boxHeight / 2;\n      ctx.strokeStyle = options.multiKeyBackground;\n      ctx.fillStyle = options.multiKeyBackground;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.fillStyle = labelColors.backgroundColor;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n    } else {\n      ctx.lineWidth = labelColors.borderWidth || 1;\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.setLineDash(labelColors.borderDash || []);\n      ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n      const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding);\n      const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2);\n      const borderRadius = toTRBLCorners(labelColors.borderRadius);\n      if (Object.values(borderRadius).some(v => v !== 0)) {\n        ctx.beginPath();\n        ctx.fillStyle = options.multiKeyBackground;\n        addRoundedRectPath(ctx, {\n          x: outerX,\n          y: colorY,\n          w: boxWidth,\n          h: boxHeight,\n          radius: borderRadius,\n        });\n        ctx.fill();\n        ctx.stroke();\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.beginPath();\n        addRoundedRectPath(ctx, {\n          x: innerX,\n          y: colorY + 1,\n          w: boxWidth - 2,\n          h: boxHeight - 2,\n          radius: borderRadius,\n        });\n        ctx.fill();\n      } else {\n        ctx.fillStyle = options.multiKeyBackground;\n        ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n      }\n    }\n    ctx.fillStyle = this.labelTextColors[i];\n  }\n  drawBody(pt, ctx, options) {\n    const {body} = this;\n    const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    let bodyLineHeight = bodyFont.lineHeight;\n    let xLinePadding = 0;\n    const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n    const fillLineOfText = function(line) {\n      ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n      pt.y += bodyLineHeight + bodySpacing;\n    };\n    const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n    let bodyItem, textColor, lines, i, j, ilen, jlen;\n    ctx.textAlign = bodyAlign;\n    ctx.textBaseline = 'middle';\n    ctx.font = bodyFont.string;\n    pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n    ctx.fillStyle = options.bodyColor;\n    each(this.beforeBody, fillLineOfText);\n    xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n      ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n      : 0;\n    for (i = 0, ilen = body.length; i < ilen; ++i) {\n      bodyItem = body[i];\n      textColor = this.labelTextColors[i];\n      ctx.fillStyle = textColor;\n      each(bodyItem.before, fillLineOfText);\n      lines = bodyItem.lines;\n      if (displayColors && lines.length) {\n        this._drawColorBox(ctx, pt, i, rtlHelper, options);\n        bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n      }\n      for (j = 0, jlen = lines.length; j < jlen; ++j) {\n        fillLineOfText(lines[j]);\n        bodyLineHeight = bodyFont.lineHeight;\n      }\n      each(bodyItem.after, fillLineOfText);\n    }\n    xLinePadding = 0;\n    bodyLineHeight = bodyFont.lineHeight;\n    each(this.afterBody, fillLineOfText);\n    pt.y -= bodySpacing;\n  }\n  drawFooter(pt, ctx, options) {\n    const footer = this.footer;\n    const length = footer.length;\n    let footerFont, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.footerAlign, options);\n      pt.y += options.footerMarginTop;\n      ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n      ctx.textBaseline = 'middle';\n      footerFont = toFont(options.footerFont);\n      ctx.fillStyle = options.footerColor;\n      ctx.font = footerFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n        pt.y += footerFont.lineHeight + options.footerSpacing;\n      }\n    }\n  }\n  drawBackground(pt, ctx, tooltipSize, options) {\n    const {xAlign, yAlign} = this;\n    const {x, y} = pt;\n    const {width, height} = tooltipSize;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.beginPath();\n    ctx.moveTo(x + topLeft, y);\n    if (yAlign === 'top') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width - topRight, y);\n    ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n    if (yAlign === 'center' && xAlign === 'right') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width, y + height - bottomRight);\n    ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n    if (yAlign === 'bottom') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + bottomLeft, y + height);\n    ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n    if (yAlign === 'center' && xAlign === 'left') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x, y + topLeft);\n    ctx.quadraticCurveTo(x, y, x + topLeft, y);\n    ctx.closePath();\n    ctx.fill();\n    if (options.borderWidth > 0) {\n      ctx.stroke();\n    }\n  }\n  _updateAnimationTarget(options) {\n    const chart = this.chart;\n    const anims = this.$animations;\n    const animX = anims && anims.x;\n    const animY = anims && anims.y;\n    if (animX || animY) {\n      const position = positioners[options.position].call(this, this._active, this._eventPosition);\n      if (!position) {\n        return;\n      }\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, this._size);\n      const alignment = determineAlignment(chart, options, positionAndSize);\n      const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n      if (animX._to !== point.x || animY._to !== point.y) {\n        this.xAlign = alignment.xAlign;\n        this.yAlign = alignment.yAlign;\n        this.width = size.width;\n        this.height = size.height;\n        this.caretX = position.x;\n        this.caretY = position.y;\n        this._resolveAnimations().update(this, point);\n      }\n    }\n  }\n  draw(ctx) {\n    const options = this.options.setContext(this.getContext());\n    let opacity = this.opacity;\n    if (!opacity) {\n      return;\n    }\n    this._updateAnimationTarget(options);\n    const tooltipSize = {\n      width: this.width,\n      height: this.height\n    };\n    const pt = {\n      x: this.x,\n      y: this.y\n    };\n    opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n    const padding = toPadding(options.padding);\n    const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n    if (options.enabled && hasTooltipContent) {\n      ctx.save();\n      ctx.globalAlpha = opacity;\n      this.drawBackground(pt, ctx, tooltipSize, options);\n      overrideTextDirection(ctx, options.textDirection);\n      pt.y += padding.top;\n      this.drawTitle(pt, ctx, options);\n      this.drawBody(pt, ctx, options);\n      this.drawFooter(pt, ctx, options);\n      restoreTextDirection(ctx, options.textDirection);\n      ctx.restore();\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements, eventPosition) {\n    const lastActive = this._active;\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.chart.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('Cannot find a dataset at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(lastActive, active);\n    const positionChanged = this._positionChanged(active, eventPosition);\n    if (changed || positionChanged) {\n      this._active = active;\n      this._eventPosition = eventPosition;\n      this._ignoreReplayEvents = true;\n      this.update(true);\n    }\n  }\n  handleEvent(e, replay, inChartArea = true) {\n    if (replay && this._ignoreReplayEvents) {\n      return false;\n    }\n    this._ignoreReplayEvents = false;\n    const options = this.options;\n    const lastActive = this._active || [];\n    const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n    const positionChanged = this._positionChanged(active, e);\n    const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n    if (changed) {\n      this._active = active;\n      if (options.enabled || options.external) {\n        this._eventPosition = {\n          x: e.x,\n          y: e.y\n        };\n        this.update(true, replay);\n      }\n    }\n    return changed;\n  }\n  _getActiveElements(e, lastActive, replay, inChartArea) {\n    const options = this.options;\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n    if (options.reverse) {\n      active.reverse();\n    }\n    return active;\n  }\n  _positionChanged(active, e) {\n    const {caretX, caretY, options} = this;\n    const position = positioners[options.position].call(this, active, e);\n    return position !== false && (caretX !== position.x || caretY !== position.y);\n  }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n  id: 'tooltip',\n  _element: Tooltip,\n  positioners,\n  afterInit(chart, _args, options) {\n    if (options) {\n      chart.tooltip = new Tooltip({chart, options});\n    }\n  },\n  beforeUpdate(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  reset(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  afterDraw(chart) {\n    const tooltip = chart.tooltip;\n    const args = {\n      tooltip\n    };\n    if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n      return;\n    }\n    if (tooltip) {\n      tooltip.draw(chart.ctx);\n    }\n    chart.notifyPlugins('afterTooltipDraw', args);\n  },\n  afterEvent(chart, args) {\n    if (chart.tooltip) {\n      const useFinalPosition = args.replay;\n      if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n        args.changed = true;\n      }\n    }\n  },\n  defaults: {\n    enabled: true,\n    external: null,\n    position: 'average',\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    titleColor: '#fff',\n    titleFont: {\n      weight: 'bold',\n    },\n    titleSpacing: 2,\n    titleMarginBottom: 6,\n    titleAlign: 'left',\n    bodyColor: '#fff',\n    bodySpacing: 2,\n    bodyFont: {\n    },\n    bodyAlign: 'left',\n    footerColor: '#fff',\n    footerSpacing: 2,\n    footerMarginTop: 6,\n    footerFont: {\n      weight: 'bold',\n    },\n    footerAlign: 'left',\n    padding: 6,\n    caretPadding: 2,\n    caretSize: 5,\n    cornerRadius: 6,\n    boxHeight: (ctx, opts) => opts.bodyFont.size,\n    boxWidth: (ctx, opts) => opts.bodyFont.size,\n    multiKeyBackground: '#fff',\n    displayColors: true,\n    boxPadding: 0,\n    borderColor: 'rgba(0,0,0,0)',\n    borderWidth: 0,\n    animation: {\n      duration: 400,\n      easing: 'easeOutQuart',\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n      },\n      opacity: {\n        easing: 'linear',\n        duration: 200\n      }\n    },\n    callbacks: {\n      beforeTitle: noop,\n      title(tooltipItems) {\n        if (tooltipItems.length > 0) {\n          const item = tooltipItems[0];\n          const labels = item.chart.data.labels;\n          const labelCount = labels ? labels.length : 0;\n          if (this && this.options && this.options.mode === 'dataset') {\n            return item.dataset.label || '';\n          } else if (item.label) {\n            return item.label;\n          } else if (labelCount > 0 && item.dataIndex < labelCount) {\n            return labels[item.dataIndex];\n          }\n        }\n        return '';\n      },\n      afterTitle: noop,\n      beforeBody: noop,\n      beforeLabel: noop,\n      label(tooltipItem) {\n        if (this && this.options && this.options.mode === 'dataset') {\n          return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n        }\n        let label = tooltipItem.dataset.label || '';\n        if (label) {\n          label += ': ';\n        }\n        const value = tooltipItem.formattedValue;\n        if (!isNullOrUndef(value)) {\n          label += value;\n        }\n        return label;\n      },\n      labelColor(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          borderColor: options.borderColor,\n          backgroundColor: options.backgroundColor,\n          borderWidth: options.borderWidth,\n          borderDash: options.borderDash,\n          borderDashOffset: options.borderDashOffset,\n          borderRadius: 0,\n        };\n      },\n      labelTextColor() {\n        return this.options.bodyColor;\n      },\n      labelPointStyle(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          pointStyle: options.pointStyle,\n          rotation: options.rotation,\n        };\n      },\n      afterLabel: noop,\n      afterBody: noop,\n      beforeFooter: noop,\n      footer: noop,\n      afterFooter: noop\n    }\n  },\n  defaultRoutes: {\n    bodyFont: 'font',\n    footerFont: 'font',\n    titleFont: 'font'\n  },\n  descriptors: {\n    _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n    _indexable: false,\n    callbacks: {\n      _scriptable: false,\n      _indexable: false,\n    },\n    animation: {\n      _fallback: false\n    },\n    animations: {\n      _fallback: 'animation'\n    }\n  },\n  additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n  if (typeof raw === 'string') {\n    index = labels.push(raw) - 1;\n    addedLabels.unshift({index, label: raw});\n  } else if (isNaN(raw)) {\n    index = null;\n  }\n  return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n  const first = labels.indexOf(raw);\n  if (first === -1) {\n    return addIfString(labels, raw, index, addedLabels);\n  }\n  const last = labels.lastIndexOf(raw);\n  return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this._startValue = undefined;\n    this._valueRange = 0;\n    this._addedLabels = [];\n  }\n  init(scaleOptions) {\n    const added = this._addedLabels;\n    if (added.length) {\n      const labels = this.getLabels();\n      for (const {index, label} of added) {\n        if (labels[index] === label) {\n          labels.splice(index, 1);\n        }\n      }\n      this._addedLabels = [];\n    }\n    super.init(scaleOptions);\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    const labels = this.getLabels();\n    index = isFinite(index) && labels[index] === raw ? index\n      : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n    return validIndex(index, labels.length - 1);\n  }\n  determineDataLimits() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this.getMinMax(true);\n    if (this.options.bounds === 'ticks') {\n      if (!minDefined) {\n        min = 0;\n      }\n      if (!maxDefined) {\n        max = this.getLabels().length - 1;\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const min = this.min;\n    const max = this.max;\n    const offset = this.options.offset;\n    const ticks = [];\n    let labels = this.getLabels();\n    labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n    this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n    this._startValue = this.min - (offset ? 0.5 : 0);\n    for (let value = min; value <= max; value++) {\n      ticks.push({value});\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    const labels = this.getLabels();\n    if (value >= 0 && value < labels.length) {\n      return labels[value];\n    }\n    return value;\n  }\n  configure() {\n    super.configure();\n    if (!this.isHorizontal()) {\n      this._reversePixels = !this._reversePixels;\n    }\n  }\n  getPixelForValue(value) {\n    if (typeof value !== 'number') {\n      value = this.parse(value);\n    }\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getValueForPixel(pixel) {\n    return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n  }\n  getBasePixel() {\n    return this.bottom;\n  }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n  ticks: {\n    callback: CategoryScale.prototype.getLabelForValue\n  }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n  const ticks = [];\n  const MIN_SPACING = 1e-14;\n  const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n  const unit = step || 1;\n  const maxSpaces = maxTicks - 1;\n  const {min: rmin, max: rmax} = dataRange;\n  const minDefined = !isNullOrUndef(min);\n  const maxDefined = !isNullOrUndef(max);\n  const countDefined = !isNullOrUndef(count);\n  const minSpacing = (rmax - rmin) / (maxDigits + 1);\n  let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n  let factor, niceMin, niceMax, numSpaces;\n  if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n    return [{value: rmin}, {value: rmax}];\n  }\n  numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n  if (numSpaces > maxSpaces) {\n    spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n  }\n  if (!isNullOrUndef(precision)) {\n    factor = Math.pow(10, precision);\n    spacing = Math.ceil(spacing * factor) / factor;\n  }\n  if (bounds === 'ticks') {\n    niceMin = Math.floor(rmin / spacing) * spacing;\n    niceMax = Math.ceil(rmax / spacing) * spacing;\n  } else {\n    niceMin = rmin;\n    niceMax = rmax;\n  }\n  if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n    numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n    spacing = (max - min) / numSpaces;\n    niceMin = min;\n    niceMax = max;\n  } else if (countDefined) {\n    niceMin = minDefined ? min : niceMin;\n    niceMax = maxDefined ? max : niceMax;\n    numSpaces = count - 1;\n    spacing = (niceMax - niceMin) / numSpaces;\n  } else {\n    numSpaces = (niceMax - niceMin) / spacing;\n    if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n      numSpaces = Math.round(numSpaces);\n    } else {\n      numSpaces = Math.ceil(numSpaces);\n    }\n  }\n  const decimalPlaces = Math.max(\n    _decimalPlaces(spacing),\n    _decimalPlaces(niceMin)\n  );\n  factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n  niceMin = Math.round(niceMin * factor) / factor;\n  niceMax = Math.round(niceMax * factor) / factor;\n  let j = 0;\n  if (minDefined) {\n    if (includeBounds && niceMin !== min) {\n      ticks.push({value: min});\n      if (niceMin < min) {\n        j++;\n      }\n      if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n        j++;\n      }\n    } else if (niceMin < min) {\n      j++;\n    }\n  }\n  for (; j < numSpaces; ++j) {\n    ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n  }\n  if (maxDefined && includeBounds && niceMax !== max) {\n    if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n      ticks[ticks.length - 1].value = max;\n    } else {\n      ticks.push({value: max});\n    }\n  } else if (!maxDefined || niceMax === max) {\n    ticks.push({value: niceMax});\n  }\n  return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n  const rad = toRadians(minRotation);\n  const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n  const length = 0.75 * minSpacing * ('' + value).length;\n  return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._endValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n      return null;\n    }\n    return +raw;\n  }\n  handleTickRangeOptions() {\n    const {beginAtZero} = this.options;\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    if (beginAtZero) {\n      const minSign = sign(min);\n      const maxSign = sign(max);\n      if (minSign < 0 && maxSign < 0) {\n        setMax(0);\n      } else if (minSign > 0 && maxSign > 0) {\n        setMin(0);\n      }\n    }\n    if (min === max) {\n      let offset = 1;\n      if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n        offset = Math.abs(max * 0.05);\n      }\n      setMax(max + offset);\n      if (!beginAtZero) {\n        setMin(min - offset);\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  getTickLimit() {\n    const tickOpts = this.options.ticks;\n    let {maxTicksLimit, stepSize} = tickOpts;\n    let maxTicks;\n    if (stepSize) {\n      maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n      if (maxTicks > 1000) {\n        console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n        maxTicks = 1000;\n      }\n    } else {\n      maxTicks = this.computeTickLimit();\n      maxTicksLimit = maxTicksLimit || 11;\n    }\n    if (maxTicksLimit) {\n      maxTicks = Math.min(maxTicksLimit, maxTicks);\n    }\n    return maxTicks;\n  }\n  computeTickLimit() {\n    return Number.POSITIVE_INFINITY;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    let maxTicks = this.getTickLimit();\n    maxTicks = Math.max(2, maxTicks);\n    const numericGeneratorOptions = {\n      maxTicks,\n      bounds: opts.bounds,\n      min: opts.min,\n      max: opts.max,\n      precision: tickOpts.precision,\n      step: tickOpts.stepSize,\n      count: tickOpts.count,\n      maxDigits: this._maxDigits(),\n      horizontal: this.isHorizontal(),\n      minRotation: tickOpts.minRotation || 0,\n      includeBounds: tickOpts.includeBounds !== false\n    };\n    const dataRange = this._range || this;\n    const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  configure() {\n    const ticks = this.ticks;\n    let start = this.min;\n    let end = this.max;\n    super.configure();\n    if (this.options.offset && ticks.length) {\n      const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n      start -= offset;\n      end += offset;\n    }\n    this._startValue = start;\n    this._endValue = end;\n    this._valueRange = end - start;\n  }\n  getLabelForValue(value) {\n    return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n}\n\nclass LinearScale extends LinearScaleBase {\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? min : 0;\n    this.max = isNumberFinite(max) ? max : 1;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    const horizontal = this.isHorizontal();\n    const length = horizontal ? this.width : this.height;\n    const minRotation = toRadians(this.options.ticks.minRotation);\n    const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n    const tickFont = this._resolveTickFontOptions(0);\n    return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n  }\n  getPixelForValue(value) {\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n  }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.numeric\n  }\n};\n\nfunction isMajor(tickVal) {\n  const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n  return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n  const endExp = Math.floor(log10(dataRange.max));\n  const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n  const ticks = [];\n  let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n  let exp = Math.floor(log10(tickVal));\n  let significand = Math.floor(tickVal / Math.pow(10, exp));\n  let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n  do {\n    ticks.push({value: tickVal, major: isMajor(tickVal)});\n    ++significand;\n    if (significand === 10) {\n      significand = 1;\n      ++exp;\n      precision = exp >= 0 ? 1 : precision;\n    }\n    tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n  } while (exp < endExp || (exp === endExp && significand < endSignificand));\n  const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n  ticks.push({value: lastTick, major: isMajor(tickVal)});\n  return ticks;\n}\nclass LogarithmicScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n    if (value === 0) {\n      this._zero = true;\n      return undefined;\n    }\n    return isNumberFinite(value) && value > 0 ? value : null;\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n    this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n    if (this.options.beginAtZero) {\n      this._zero = true;\n    }\n    this.handleTickRangeOptions();\n  }\n  handleTickRangeOptions() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let min = this.min;\n    let max = this.max;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n    if (min === max) {\n      if (min <= 0) {\n        setMin(1);\n        setMax(10);\n      } else {\n        setMin(exp(min, -1));\n        setMax(exp(max, +1));\n      }\n    }\n    if (min <= 0) {\n      setMin(exp(max, -1));\n    }\n    if (max <= 0) {\n      setMax(exp(min, +1));\n    }\n    if (this._zero && this.min !== this._suggestedMin && min === exp(this.min, 0)) {\n      setMin(exp(min, -1));\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const generationOptions = {\n      min: this._userMin,\n      max: this._userMax\n    };\n    const ticks = generateTicks(generationOptions, this);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    return value === undefined\n      ? '0'\n      : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n  configure() {\n    const start = this.min;\n    super.configure();\n    this._startValue = log10(start);\n    this._valueRange = log10(this.max) - log10(start);\n  }\n  getPixelForValue(value) {\n    if (value === undefined || value === 0) {\n      value = this.min;\n    }\n    if (value === null || isNaN(value)) {\n      return NaN;\n    }\n    return this.getPixelForDecimal(value === this.min\n      ? 0\n      : (log10(value) - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    const decimal = this.getDecimalForPixel(pixel);\n    return Math.pow(10, this._startValue + decimal * this._valueRange);\n  }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.logarithmic,\n    major: {\n      enabled: true\n    }\n  }\n};\n\nfunction getTickBackdropHeight(opts) {\n  const tickOpts = opts.ticks;\n  if (tickOpts.display && opts.display) {\n    const padding = toPadding(tickOpts.backdropPadding);\n    return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n  }\n  return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n  label = isArray(label) ? label : [label];\n  return {\n    w: _longestText(ctx, font.string, label),\n    h: label.length * font.lineHeight\n  };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n  if (angle === min || angle === max) {\n    return {\n      start: pos - (size / 2),\n      end: pos + (size / 2)\n    };\n  } else if (angle < min || angle > max) {\n    return {\n      start: pos - size,\n      end: pos\n    };\n  }\n  return {\n    start: pos,\n    end: pos + size\n  };\n}\nfunction fitWithPointLabels(scale) {\n  const orig = {\n    l: scale.left + scale._padding.left,\n    r: scale.right - scale._padding.right,\n    t: scale.top + scale._padding.top,\n    b: scale.bottom - scale._padding.bottom\n  };\n  const limits = Object.assign({}, orig);\n  const labelSizes = [];\n  const padding = [];\n  const valueCount = scale._pointLabels.length;\n  const pointLabelOpts = scale.options.pointLabels;\n  const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n    padding[i] = opts.padding;\n    const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n    const plFont = toFont(opts.font);\n    const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n    labelSizes[i] = textSize;\n    const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n    const angle = Math.round(toDegrees(angleRadians));\n    const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n    const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n    updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n  }\n  scale.setCenterPoint(\n    orig.l - limits.l,\n    limits.r - orig.r,\n    orig.t - limits.t,\n    limits.b - orig.b\n  );\n  scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n  const sin = Math.abs(Math.sin(angle));\n  const cos = Math.abs(Math.cos(angle));\n  let x = 0;\n  let y = 0;\n  if (hLimits.start < orig.l) {\n    x = (orig.l - hLimits.start) / sin;\n    limits.l = Math.min(limits.l, orig.l - x);\n  } else if (hLimits.end > orig.r) {\n    x = (hLimits.end - orig.r) / sin;\n    limits.r = Math.max(limits.r, orig.r + x);\n  }\n  if (vLimits.start < orig.t) {\n    y = (orig.t - vLimits.start) / cos;\n    limits.t = Math.min(limits.t, orig.t - y);\n  } else if (vLimits.end > orig.b) {\n    y = (vLimits.end - orig.b) / cos;\n    limits.b = Math.max(limits.b, orig.b + y);\n  }\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n  const items = [];\n  const valueCount = scale._pointLabels.length;\n  const opts = scale.options;\n  const extra = getTickBackdropHeight(opts) / 2;\n  const outerDistance = scale.drawingArea;\n  const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n    const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n    const size = labelSizes[i];\n    const y = yForAngle(pointLabelPosition.y, size.h, angle);\n    const textAlign = getTextAlignForAngle(angle);\n    const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n    items.push({\n      x: pointLabelPosition.x,\n      y,\n      textAlign,\n      left,\n      top: y,\n      right: left + size.w,\n      bottom: y + size.h\n    });\n  }\n  return items;\n}\nfunction getTextAlignForAngle(angle) {\n  if (angle === 0 || angle === 180) {\n    return 'center';\n  } else if (angle < 180) {\n    return 'left';\n  }\n  return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n  if (align === 'right') {\n    x -= w;\n  } else if (align === 'center') {\n    x -= (w / 2);\n  }\n  return x;\n}\nfunction yForAngle(y, h, angle) {\n  if (angle === 90 || angle === 270) {\n    y -= (h / 2);\n  } else if (angle > 270 || angle < 90) {\n    y -= h;\n  }\n  return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n  const {ctx, options: {pointLabels}} = scale;\n  for (let i = labelCount - 1; i >= 0; i--) {\n    const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n    const plFont = toFont(optsAtIndex.font);\n    const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n    const {backdropColor} = optsAtIndex;\n    if (!isNullOrUndef(backdropColor)) {\n      const padding = toPadding(optsAtIndex.backdropPadding);\n      ctx.fillStyle = backdropColor;\n      ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n    }\n    renderText(\n      ctx,\n      scale._pointLabels[i],\n      x,\n      y + (plFont.lineHeight / 2),\n      plFont,\n      {\n        color: optsAtIndex.color,\n        textAlign: textAlign,\n        textBaseline: 'middle'\n      }\n    );\n  }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n  const {ctx} = scale;\n  if (circular) {\n    ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n  } else {\n    let pointPosition = scale.getPointPosition(0, radius);\n    ctx.moveTo(pointPosition.x, pointPosition.y);\n    for (let i = 1; i < labelCount; i++) {\n      pointPosition = scale.getPointPosition(i, radius);\n      ctx.lineTo(pointPosition.x, pointPosition.y);\n    }\n  }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n  const ctx = scale.ctx;\n  const circular = gridLineOpts.circular;\n  const {color, lineWidth} = gridLineOpts;\n  if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n    return;\n  }\n  ctx.save();\n  ctx.strokeStyle = color;\n  ctx.lineWidth = lineWidth;\n  ctx.setLineDash(gridLineOpts.borderDash);\n  ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n  ctx.beginPath();\n  pathRadiusLine(scale, radius, circular, labelCount);\n  ctx.closePath();\n  ctx.stroke();\n  ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n  return createContext(parent, {\n    label,\n    index,\n    type: 'pointLabel'\n  });\n}\nclass RadialLinearScale extends LinearScaleBase {\n  constructor(cfg) {\n    super(cfg);\n    this.xCenter = undefined;\n    this.yCenter = undefined;\n    this.drawingArea = undefined;\n    this._pointLabels = [];\n    this._pointLabelItems = [];\n  }\n  setDimensions() {\n    const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n    const w = this.width = this.maxWidth - padding.width;\n    const h = this.height = this.maxHeight - padding.height;\n    this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n    this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n    this.drawingArea = Math.floor(Math.min(w, h) / 2);\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(false);\n    this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n    this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n  }\n  generateTickLabels(ticks) {\n    LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n    this._pointLabels = this.getLabels()\n      .map((value, index) => {\n        const label = callback(this.options.pointLabels.callback, [value, index], this);\n        return label || label === 0 ? label : '';\n      })\n      .filter((v, i) => this.chart.getDataVisibility(i));\n  }\n  fit() {\n    const opts = this.options;\n    if (opts.display && opts.pointLabels.display) {\n      fitWithPointLabels(this);\n    } else {\n      this.setCenterPoint(0, 0, 0, 0);\n    }\n  }\n  setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n    this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n    this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n    this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n  }\n  getIndexAngle(index) {\n    const angleMultiplier = TAU / (this._pointLabels.length || 1);\n    const startAngle = this.options.startAngle || 0;\n    return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n  }\n  getDistanceFromCenterForValue(value) {\n    if (isNullOrUndef(value)) {\n      return NaN;\n    }\n    const scalingFactor = this.drawingArea / (this.max - this.min);\n    if (this.options.reverse) {\n      return (this.max - value) * scalingFactor;\n    }\n    return (value - this.min) * scalingFactor;\n  }\n  getValueForDistanceFromCenter(distance) {\n    if (isNullOrUndef(distance)) {\n      return NaN;\n    }\n    const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n    return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n  }\n  getPointLabelContext(index) {\n    const pointLabels = this._pointLabels || [];\n    if (index >= 0 && index < pointLabels.length) {\n      const pointLabel = pointLabels[index];\n      return createPointLabelContext(this.getContext(), index, pointLabel);\n    }\n  }\n  getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n    const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n    return {\n      x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n      y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n      angle\n    };\n  }\n  getPointPositionForValue(index, value) {\n    return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n  }\n  getBasePosition(index) {\n    return this.getPointPositionForValue(index || 0, this.getBaseValue());\n  }\n  getPointLabelPosition(index) {\n    const {left, top, right, bottom} = this._pointLabelItems[index];\n    return {\n      left,\n      top,\n      right,\n      bottom,\n    };\n  }\n  drawBackground() {\n    const {backgroundColor, grid: {circular}} = this.options;\n    if (backgroundColor) {\n      const ctx = this.ctx;\n      ctx.save();\n      ctx.beginPath();\n      pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n      ctx.closePath();\n      ctx.fillStyle = backgroundColor;\n      ctx.fill();\n      ctx.restore();\n    }\n  }\n  drawGrid() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const {angleLines, grid} = opts;\n    const labelCount = this._pointLabels.length;\n    let i, offset, position;\n    if (opts.pointLabels.display) {\n      drawPointLabels(this, labelCount);\n    }\n    if (grid.display) {\n      this.ticks.forEach((tick, index) => {\n        if (index !== 0) {\n          offset = this.getDistanceFromCenterForValue(tick.value);\n          const optsAtIndex = grid.setContext(this.getContext(index - 1));\n          drawRadiusLine(this, optsAtIndex, offset, labelCount);\n        }\n      });\n    }\n    if (angleLines.display) {\n      ctx.save();\n      for (i = labelCount - 1; i >= 0; i--) {\n        const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n        const {color, lineWidth} = optsAtIndex;\n        if (!lineWidth || !color) {\n          continue;\n        }\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = color;\n        ctx.setLineDash(optsAtIndex.borderDash);\n        ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n        offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n        position = this.getPointPosition(i, offset);\n        ctx.beginPath();\n        ctx.moveTo(this.xCenter, this.yCenter);\n        ctx.lineTo(position.x, position.y);\n        ctx.stroke();\n      }\n      ctx.restore();\n    }\n  }\n  drawBorder() {}\n  drawLabels() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    if (!tickOpts.display) {\n      return;\n    }\n    const startAngle = this.getIndexAngle(0);\n    let offset, width;\n    ctx.save();\n    ctx.translate(this.xCenter, this.yCenter);\n    ctx.rotate(startAngle);\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n    this.ticks.forEach((tick, index) => {\n      if (index === 0 && !opts.reverse) {\n        return;\n      }\n      const optsAtIndex = tickOpts.setContext(this.getContext(index));\n      const tickFont = toFont(optsAtIndex.font);\n      offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n      if (optsAtIndex.showLabelBackdrop) {\n        ctx.font = tickFont.string;\n        width = ctx.measureText(tick.label).width;\n        ctx.fillStyle = optsAtIndex.backdropColor;\n        const padding = toPadding(optsAtIndex.backdropPadding);\n        ctx.fillRect(\n          -width / 2 - padding.left,\n          -offset - tickFont.size / 2 - padding.top,\n          width + padding.width,\n          tickFont.size + padding.height\n        );\n      }\n      renderText(ctx, tick.label, 0, -offset, tickFont, {\n        color: optsAtIndex.color,\n      });\n    });\n    ctx.restore();\n  }\n  drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n  display: true,\n  animate: true,\n  position: 'chartArea',\n  angleLines: {\n    display: true,\n    lineWidth: 1,\n    borderDash: [],\n    borderDashOffset: 0.0\n  },\n  grid: {\n    circular: false\n  },\n  startAngle: 0,\n  ticks: {\n    showLabelBackdrop: true,\n    callback: Ticks.formatters.numeric\n  },\n  pointLabels: {\n    backdropColor: undefined,\n    backdropPadding: 2,\n    display: true,\n    font: {\n      size: 10\n    },\n    callback(label) {\n      return label;\n    },\n    padding: 5,\n    centerPointLabels: false\n  }\n};\nRadialLinearScale.defaultRoutes = {\n  'angleLines.color': 'borderColor',\n  'pointLabels.color': 'color',\n  'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n  angleLines: {\n    _fallback: 'grid'\n  }\n};\n\nconst INTERVALS = {\n  millisecond: {common: true, size: 1, steps: 1000},\n  second: {common: true, size: 1000, steps: 60},\n  minute: {common: true, size: 60000, steps: 60},\n  hour: {common: true, size: 3600000, steps: 24},\n  day: {common: true, size: 86400000, steps: 30},\n  week: {common: false, size: 604800000, steps: 4},\n  month: {common: true, size: 2.628e9, steps: 12},\n  quarter: {common: false, size: 7.884e9, steps: 4},\n  year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n  return a - b;\n}\nfunction parse(scale, input) {\n  if (isNullOrUndef(input)) {\n    return null;\n  }\n  const adapter = scale._adapter;\n  const {parser, round, isoWeekday} = scale._parseOpts;\n  let value = input;\n  if (typeof parser === 'function') {\n    value = parser(value);\n  }\n  if (!isNumberFinite(value)) {\n    value = typeof parser === 'string'\n      ? adapter.parse(value, parser)\n      : adapter.parse(value);\n  }\n  if (value === null) {\n    return null;\n  }\n  if (round) {\n    value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n      ? adapter.startOf(value, 'isoWeek', isoWeekday)\n      : adapter.startOf(value, round);\n  }\n  return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n  const ilen = UNITS.length;\n  for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n    const interval = INTERVALS[UNITS[i]];\n    const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n    if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n      return UNITS[i];\n    }\n  }\n  return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n  for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n    const unit = UNITS[i];\n    if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n      return unit;\n    }\n  }\n  return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n  for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n    if (INTERVALS[UNITS[i]].common) {\n      return UNITS[i];\n    }\n  }\n}\nfunction addTick(ticks, time, timestamps) {\n  if (!timestamps) {\n    ticks[time] = true;\n  } else if (timestamps.length) {\n    const {lo, hi} = _lookup(timestamps, time);\n    const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n    ticks[timestamp] = true;\n  }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n  const adapter = scale._adapter;\n  const first = +adapter.startOf(ticks[0].value, majorUnit);\n  const last = ticks[ticks.length - 1].value;\n  let major, index;\n  for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n    index = map[major];\n    if (index >= 0) {\n      ticks[index].major = true;\n    }\n  }\n  return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n  const ticks = [];\n  const map = {};\n  const ilen = values.length;\n  let i, value;\n  for (i = 0; i < ilen; ++i) {\n    value = values[i];\n    map[value] = i;\n    ticks.push({\n      value,\n      major: false\n    });\n  }\n  return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n  constructor(props) {\n    super(props);\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n    this._unit = 'day';\n    this._majorUnit = undefined;\n    this._offsets = {};\n    this._normalized = false;\n    this._parseOpts = undefined;\n  }\n  init(scaleOpts, opts) {\n    const time = scaleOpts.time || (scaleOpts.time = {});\n    const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n    mergeIf(time.displayFormats, adapter.formats());\n    this._parseOpts = {\n      parser: time.parser,\n      round: time.round,\n      isoWeekday: time.isoWeekday\n    };\n    super.init(scaleOpts);\n    this._normalized = opts.normalized;\n  }\n  parse(raw, index) {\n    if (raw === undefined) {\n      return null;\n    }\n    return parse(this, raw);\n  }\n  beforeLayout() {\n    super.beforeLayout();\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n  }\n  determineDataLimits() {\n    const options = this.options;\n    const adapter = this._adapter;\n    const unit = options.time.unit || 'day';\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    function _applyBounds(bounds) {\n      if (!minDefined && !isNaN(bounds.min)) {\n        min = Math.min(min, bounds.min);\n      }\n      if (!maxDefined && !isNaN(bounds.max)) {\n        max = Math.max(max, bounds.max);\n      }\n    }\n    if (!minDefined || !maxDefined) {\n      _applyBounds(this._getLabelBounds());\n      if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n        _applyBounds(this.getMinMax(false));\n      }\n    }\n    min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n    max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n    this.min = Math.min(min, max - 1);\n    this.max = Math.max(min + 1, max);\n  }\n  _getLabelBounds() {\n    const arr = this.getLabelTimestamps();\n    let min = Number.POSITIVE_INFINITY;\n    let max = Number.NEGATIVE_INFINITY;\n    if (arr.length) {\n      min = arr[0];\n      max = arr[arr.length - 1];\n    }\n    return {min, max};\n  }\n  buildTicks() {\n    const options = this.options;\n    const timeOpts = options.time;\n    const tickOpts = options.ticks;\n    const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n    if (options.bounds === 'ticks' && timestamps.length) {\n      this.min = this._userMin || timestamps[0];\n      this.max = this._userMax || timestamps[timestamps.length - 1];\n    }\n    const min = this.min;\n    const max = this.max;\n    const ticks = _filterBetween(timestamps, min, max);\n    this._unit = timeOpts.unit || (tickOpts.autoSkip\n      ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n      : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n    this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n      : determineMajorUnit(this._unit);\n    this.initOffsets(timestamps);\n    if (options.reverse) {\n      ticks.reverse();\n    }\n    return ticksFromTimestamps(this, ticks, this._majorUnit);\n  }\n  initOffsets(timestamps) {\n    let start = 0;\n    let end = 0;\n    let first, last;\n    if (this.options.offset && timestamps.length) {\n      first = this.getDecimalForValue(timestamps[0]);\n      if (timestamps.length === 1) {\n        start = 1 - first;\n      } else {\n        start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n      }\n      last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n      if (timestamps.length === 1) {\n        end = last;\n      } else {\n        end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n      }\n    }\n    const limit = timestamps.length < 3 ? 0.5 : 0.25;\n    start = _limitValue(start, 0, limit);\n    end = _limitValue(end, 0, limit);\n    this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n  }\n  _generate() {\n    const adapter = this._adapter;\n    const min = this.min;\n    const max = this.max;\n    const options = this.options;\n    const timeOpts = options.time;\n    const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n    const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n    const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n    const hasWeekday = isNumber(weekday) || weekday === true;\n    const ticks = {};\n    let first = min;\n    let time, count;\n    if (hasWeekday) {\n      first = +adapter.startOf(first, 'isoWeek', weekday);\n    }\n    first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n    if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n      throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n    }\n    const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n    for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n      addTick(ticks, time, timestamps);\n    }\n    if (time === max || options.bounds === 'ticks' || count === 1) {\n      addTick(ticks, time, timestamps);\n    }\n    return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n  }\n  getLabelForValue(value) {\n    const adapter = this._adapter;\n    const timeOpts = this.options.time;\n    if (timeOpts.tooltipFormat) {\n      return adapter.format(value, timeOpts.tooltipFormat);\n    }\n    return adapter.format(value, timeOpts.displayFormats.datetime);\n  }\n  _tickFormatFunction(time, index, ticks, format) {\n    const options = this.options;\n    const formats = options.time.displayFormats;\n    const unit = this._unit;\n    const majorUnit = this._majorUnit;\n    const minorFormat = unit && formats[unit];\n    const majorFormat = majorUnit && formats[majorUnit];\n    const tick = ticks[index];\n    const major = majorUnit && majorFormat && tick && tick.major;\n    const label = this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n    const formatter = options.ticks.callback;\n    return formatter ? callback(formatter, [label, index, ticks], this) : label;\n  }\n  generateTickLabels(ticks) {\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      tick.label = this._tickFormatFunction(tick.value, i, ticks);\n    }\n  }\n  getDecimalForValue(value) {\n    return value === null ? NaN : (value - this.min) / (this.max - this.min);\n  }\n  getPixelForValue(value) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForValue(value);\n    return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return this.min + pos * (this.max - this.min);\n  }\n  _getLabelSize(label) {\n    const ticksOpts = this.options.ticks;\n    const tickLabelWidth = this.ctx.measureText(label).width;\n    const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n    const cosRotation = Math.cos(angle);\n    const sinRotation = Math.sin(angle);\n    const tickFontSize = this._resolveTickFontOptions(0).size;\n    return {\n      w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n      h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n    };\n  }\n  _getLabelCapacity(exampleTime) {\n    const timeOpts = this.options.time;\n    const displayFormats = timeOpts.displayFormats;\n    const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n    const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n    const size = this._getLabelSize(exampleLabel);\n    const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n    return capacity > 0 ? capacity : 1;\n  }\n  getDataTimestamps() {\n    let timestamps = this._cache.data || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const metas = this.getMatchingVisibleMetas();\n    if (this._normalized && metas.length) {\n      return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n    }\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n    }\n    return (this._cache.data = this.normalize(timestamps));\n  }\n  getLabelTimestamps() {\n    const timestamps = this._cache.labels || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const labels = this.getLabels();\n    for (i = 0, ilen = labels.length; i < ilen; ++i) {\n      timestamps.push(parse(this, labels[i]));\n    }\n    return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n  }\n  normalize(values) {\n    return _arrayUnique(values.sort(sorter));\n  }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n  bounds: 'data',\n  adapters: {},\n  time: {\n    parser: false,\n    unit: false,\n    round: false,\n    isoWeekday: false,\n    minUnit: 'millisecond',\n    displayFormats: {}\n  },\n  ticks: {\n    source: 'auto',\n    major: {\n      enabled: false\n    }\n  }\n};\n\nfunction interpolate(table, val, reverse) {\n  let lo = 0;\n  let hi = table.length - 1;\n  let prevSource, nextSource, prevTarget, nextTarget;\n  if (reverse) {\n    if (val >= table[lo].pos && val <= table[hi].pos) {\n      ({lo, hi} = _lookupByKey(table, 'pos', val));\n    }\n    ({pos: prevSource, time: prevTarget} = table[lo]);\n    ({pos: nextSource, time: nextTarget} = table[hi]);\n  } else {\n    if (val >= table[lo].time && val <= table[hi].time) {\n      ({lo, hi} = _lookupByKey(table, 'time', val));\n    }\n    ({time: prevSource, pos: prevTarget} = table[lo]);\n    ({time: nextSource, pos: nextTarget} = table[hi]);\n  }\n  const span = nextSource - prevSource;\n  return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n  constructor(props) {\n    super(props);\n    this._table = [];\n    this._minPos = undefined;\n    this._tableRange = undefined;\n  }\n  initOffsets() {\n    const timestamps = this._getTimestampsForTable();\n    const table = this._table = this.buildLookupTable(timestamps);\n    this._minPos = interpolate(table, this.min);\n    this._tableRange = interpolate(table, this.max) - this._minPos;\n    super.initOffsets(timestamps);\n  }\n  buildLookupTable(timestamps) {\n    const {min, max} = this;\n    const items = [];\n    const table = [];\n    let i, ilen, prev, curr, next;\n    for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n      curr = timestamps[i];\n      if (curr >= min && curr <= max) {\n        items.push(curr);\n      }\n    }\n    if (items.length < 2) {\n      return [\n        {time: min, pos: 0},\n        {time: max, pos: 1}\n      ];\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      next = items[i + 1];\n      prev = items[i - 1];\n      curr = items[i];\n      if (Math.round((next + prev) / 2) !== curr) {\n        table.push({time: curr, pos: i / (ilen - 1)});\n      }\n    }\n    return table;\n  }\n  _getTimestampsForTable() {\n    let timestamps = this._cache.all || [];\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const data = this.getDataTimestamps();\n    const label = this.getLabelTimestamps();\n    if (data.length && label.length) {\n      timestamps = this.normalize(data.concat(label));\n    } else {\n      timestamps = data.length ? data : label;\n    }\n    timestamps = this._cache.all = timestamps;\n    return timestamps;\n  }\n  getDecimalForValue(value) {\n    return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n  }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n  controllers,\n  elements,\n  plugins,\n  scales,\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, plugin_filler as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n","/*!\n* chartjs-plugin-annotation v1.4.0\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2022 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, defaults, Animations, Chart } from 'chart.js';\nimport { defined, distanceBetweenPoints, callback, isFinite, valueOrDefault, isObject, toRadians, toFont, isArray, addRoundedRectPath, toTRBLCorners, toPadding, PI, drawPoint, RAD_PER_DEG, clipArea, unclipArea } from 'chart.js/helpers';\n\nconst clickHooks = ['click', 'dblclick'];\nconst moveHooks = ['enter', 'leave'];\nconst hooks = clickHooks.concat(moveHooks);\n\nfunction updateListeners(chart, state, options) {\n  state.listened = false;\n  state.moveListened = false;\n\n  hooks.forEach(hook => {\n    if (typeof options[hook] === 'function') {\n      state.listened = true;\n      state.listeners[hook] = options[hook];\n    } else if (defined(state.listeners[hook])) {\n      delete state.listeners[hook];\n    }\n  });\n  moveHooks.forEach(hook => {\n    if (typeof options[hook] === 'function') {\n      state.moveListened = true;\n    }\n  });\n\n  if (!state.listened || !state.moveListened) {\n    state.annotations.forEach(scope => {\n      if (!state.listened) {\n        clickHooks.forEach(hook => {\n          if (typeof scope[hook] === 'function') {\n            state.listened = true;\n          }\n        });\n      }\n      if (!state.moveListened) {\n        moveHooks.forEach(hook => {\n          if (typeof scope[hook] === 'function') {\n            state.listened = true;\n            state.moveListened = true;\n          }\n        });\n      }\n    });\n  }\n}\n\nfunction handleEvent(state, event, options) {\n  if (state.listened) {\n    switch (event.type) {\n    case 'mousemove':\n    case 'mouseout':\n      handleMoveEvents(state, event);\n      break;\n    case 'click':\n      handleClickEvents(state, event, options);\n      break;\n    }\n  }\n}\n\nfunction handleMoveEvents(state, event) {\n  if (!state.moveListened) {\n    return;\n  }\n\n  let element;\n\n  if (event.type === 'mousemove') {\n    element = getNearestItem(state.elements, event);\n  }\n\n  const previous = state.hovered;\n  state.hovered = element;\n\n  dispatchMoveEvents(state, {previous, element}, event);\n}\n\nfunction dispatchMoveEvents(state, elements, event) {\n  const {previous, element} = elements;\n  if (previous && previous !== element) {\n    dispatchEvent(previous.options.leave || state.listeners.leave, previous, event);\n  }\n  if (element && element !== previous) {\n    dispatchEvent(element.options.enter || state.listeners.enter, element, event);\n  }\n}\n\nfunction handleClickEvents(state, event, options) {\n  const listeners = state.listeners;\n  const element = getNearestItem(state.elements, event);\n  if (element) {\n    const elOpts = element.options;\n    const dblclick = elOpts.dblclick || listeners.dblclick;\n    const click = elOpts.click || listeners.click;\n    if (element.clickTimeout) {\n      // 2nd click before timeout, so its a double click\n      clearTimeout(element.clickTimeout);\n      delete element.clickTimeout;\n      dispatchEvent(dblclick, element, event);\n    } else if (dblclick) {\n      // if there is a dblclick handler, wait for dblClickSpeed ms before deciding its a click\n      element.clickTimeout = setTimeout(() => {\n        delete element.clickTimeout;\n        dispatchEvent(click, element, event);\n      }, options.dblClickSpeed);\n    } else {\n      // no double click handler, just call the click handler directly\n      dispatchEvent(click, element, event);\n    }\n  }\n}\n\nfunction dispatchEvent(handler, element, event) {\n  callback(handler, [element.$context, event]);\n}\n\nfunction getNearestItem(elements, position) {\n  let minDistance = Number.POSITIVE_INFINITY;\n\n  return elements\n    .filter((element) => element.options.display && element.inRange(position.x, position.y))\n    .reduce((nearestItems, element) => {\n      const center = element.getCenterPoint();\n      const distance = distanceBetweenPoints(position, center);\n\n      if (distance < minDistance) {\n        nearestItems = [element];\n        minDistance = distance;\n      } else if (distance === minDistance) {\n        // Can have multiple items at the same distance in which case we sort by size\n        nearestItems.push(element);\n      }\n\n      return nearestItems;\n    }, [])\n    .sort((a, b) => a._index - b._index)\n    .slice(0, 1)[0]; // return only the top item\n}\n\nfunction adjustScaleRange(chart, scale, annotations) {\n  const range = getScaleLimits(scale, annotations);\n  let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n  changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n  if (changed && typeof scale.handleTickRangeOptions === 'function') {\n    scale.handleTickRangeOptions();\n  }\n}\n\nfunction verifyScaleOptions(annotations, scales) {\n  for (const annotation of annotations) {\n    verifyScaleIDs(annotation, scales);\n  }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n  if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n    const changed = scale[limit] !== range[limit];\n    scale[limit] = range[limit];\n    return changed;\n  }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n  return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n  for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n    if (annotation[key] && !scales[annotation[key]] && verifyProperties(annotation, key)) {\n      console.warn(`No scale found with id '${annotation[key]}' for annotation '${annotation.id}'`);\n    }\n  }\n}\n\nfunction verifyProperties(annotation, key) {\n  if (key === 'scaleID') {\n    return true;\n  }\n  const axis = key.charAt(0);\n  for (const prop of ['Min', 'Max', 'Value']) {\n    if (defined(annotation[axis + prop])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction getScaleLimits(scale, annotations) {\n  const axis = scale.axis;\n  const scaleID = scale.id;\n  const scaleIDOption = axis + 'ScaleID';\n  const limits = {\n    min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n    max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n  };\n  for (const annotation of annotations) {\n    if (annotation.scaleID === scaleID) {\n      updateLimits(annotation, scale, ['value', 'endValue'], limits);\n    } else if (annotation[scaleIDOption] === scaleID) {\n      updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n    }\n  }\n  return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n  for (const prop of props) {\n    const raw = annotation[prop];\n    if (defined(raw)) {\n      const value = scale.parse(raw);\n      limits.min = Math.min(limits.min, value);\n      limits.max = Math.max(limits.max, value);\n    }\n  }\n}\n\nconst EPSILON = 0.001;\n\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\nfunction clampAll(obj, from, to) {\n  for (const key of Object.keys(obj)) {\n    obj[key] = clamp(obj[key], from, to);\n  }\n  return obj;\n}\n\nfunction inPointRange(point, center, radius, borderWidth) {\n  if (!point || !center || radius <= 0) {\n    return false;\n  }\n  const hBorderWidth = borderWidth / 2 || 0;\n  return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hBorderWidth, 2);\n}\n\nfunction inBoxRange(mouseX, mouseY, {x, y, width, height}, borderWidth) {\n  const hBorderWidth = borderWidth / 2;\n  return mouseX >= x - hBorderWidth - EPSILON &&\n         mouseX <= x + width + hBorderWidth + EPSILON &&\n         mouseY >= y - hBorderWidth - EPSILON &&\n         mouseY <= y + height + hBorderWidth + EPSILON;\n}\n\nfunction getElementCenterPoint(element, useFinalPosition) {\n  const {x, y} = element.getProps(['x', 'y'], useFinalPosition);\n  return {x, y};\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.substr(0, req.length) === req);\n\nfunction requireVersion(pkg, min, ver, strict = true) {\n  const parts = ver.split('.');\n  let i = 0;\n  for (const req of min.split('.')) {\n    const act = parts[i++];\n    if (parseInt(req, 10) < parseInt(act, 10)) {\n      break;\n    }\n    if (isOlderPart(act, req)) {\n      if (strict) {\n        throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => clamp(parseFloat(s) / 100, 0, 1);\n\nfunction getRelativePosition(size, positionOption) {\n  if (positionOption === 'start') {\n    return 0;\n  }\n  if (positionOption === 'end') {\n    return size;\n  }\n  if (isPercentString(positionOption)) {\n    return toPercent(positionOption) * size;\n  }\n  return size / 2;\n}\n\nfunction getSize(size, value) {\n  if (typeof value === 'number') {\n    return value;\n  } else if (isPercentString(value)) {\n    return toPercent(value) * size;\n  }\n  return size;\n}\n\nfunction calculateTextAlignment(size, options) {\n  const {x, width} = size;\n  const textAlign = options.textAlign;\n  if (textAlign === 'center') {\n    return x + width / 2;\n  } else if (textAlign === 'end' || textAlign === 'right') {\n    return x + width;\n  }\n  return x;\n}\n\nfunction toPosition(value) {\n  if (isObject(value)) {\n    return {\n      x: valueOrDefault(value.x, 'center'),\n      y: valueOrDefault(value.y, 'center'),\n    };\n  }\n  value = valueOrDefault(value, 'center');\n  return {\n    x: value,\n    y: value\n  };\n}\n\nfunction isBoundToPoint(options) {\n  return options && (defined(options.xValue) || defined(options.yValue));\n}\n\nconst widthCache = new Map();\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n  if (content && typeof content === 'object') {\n    const type = content.toString();\n    return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n  }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Element} element - annotation element to use for applying the translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, element, rotation) {\n  if (rotation) {\n    const center = element.getCenterPoint();\n    ctx.translate(center.x, center.y);\n    ctx.rotate(toRadians(rotation));\n    ctx.translate(-center.x, -center.y);\n  }\n}\n\n/**\n * Apply border options to the canvas context before drawing a shape\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options with border configuration\n * @returns {boolean} true is the border options have been applied\n */\nfunction setBorderStyle(ctx, options) {\n  if (options && options.borderWidth) {\n    ctx.lineCap = options.borderCapStyle;\n    ctx.setLineDash(options.borderDash);\n    ctx.lineDashOffset = options.borderDashOffset;\n    ctx.lineJoin = options.borderJoinStyle;\n    ctx.lineWidth = options.borderWidth;\n    ctx.strokeStyle = options.borderColor;\n    return true;\n  }\n}\n\n/**\n * Apply shadow options to the canvas context before drawing a shape\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options with shadow configuration\n */\nfunction setShadowStyle(ctx, options) {\n  ctx.shadowColor = options.backgroundShadowColor;\n  ctx.shadowBlur = options.shadowBlur;\n  ctx.shadowOffsetX = options.shadowOffsetX;\n  ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * Measure the label size using the label options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options to configure the label\n * @returns {{width: number, height: number}} the measured size of the label\n */\nfunction measureLabelSize(ctx, options) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    return {\n      width: getSize(content.width, options.width),\n      height: getSize(content.height, options.height)\n    };\n  }\n  const font = toFont(options.font);\n  const strokeWidth = options.textStrokeWidth;\n  const lines = isArray(content) ? content : [content];\n  const mapKey = lines.join() + font.string + strokeWidth + (ctx._measureText ? '-spriting' : '');\n  if (!widthCache.has(mapKey)) {\n    ctx.save();\n    ctx.font = font.string;\n    const count = lines.length;\n    let width = 0;\n    for (let i = 0; i < count; i++) {\n      const text = lines[i];\n      width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n    }\n    ctx.restore();\n    const height = count * font.lineHeight + strokeWidth;\n    widthCache.set(mapKey, {width, height});\n  }\n  return widthCache.get(mapKey);\n}\n\n/**\n * Draw a box with the size and the styling options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {{x: number, y: number, width: number, height: number}} rect - rect to draw\n * @param {Object} options - options to style the box\n * @returns {undefined}\n */\nfunction drawBox(ctx, rect, options) {\n  const {x, y, width, height} = rect;\n  ctx.save();\n  setShadowStyle(ctx, options);\n  const stroke = setBorderStyle(ctx, options);\n  ctx.fillStyle = options.backgroundColor;\n  ctx.beginPath();\n  addRoundedRectPath(ctx, {\n    x, y, w: width, h: height,\n    // TODO: v2 remove support for cornerRadius\n    radius: clampAll(toTRBLCorners(valueOrDefault(options.cornerRadius, options.borderRadius)), 0, Math.min(width, height) / 2)\n  });\n  ctx.closePath();\n  ctx.fill();\n  if (stroke) {\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\n/**\n * Draw a label with the size and the styling options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {{x: number, y: number, width: number, height: number}} rect - rect to map teh label\n * @param {Object} options - options to style the label\n * @returns {undefined}\n */\nfunction drawLabel(ctx, rect, options) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n    return;\n  }\n  const labels = isArray(content) ? content : [content];\n  const font = toFont(options.font);\n  const lh = font.lineHeight;\n  const x = calculateTextAlignment(rect, options);\n  const y = rect.y + (lh / 2) + options.textStrokeWidth / 2;\n  ctx.save();\n  ctx.font = font.string;\n  ctx.textBaseline = 'middle';\n  ctx.textAlign = options.textAlign;\n  if (setTextStrokeStyle(ctx, options)) {\n    labels.forEach((l, i) => ctx.strokeText(l, x, y + (i * lh)));\n  }\n  ctx.fillStyle = options.color;\n  labels.forEach((l, i) => ctx.fillText(l, x, y + (i * lh)));\n  ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n  if (options.textStrokeWidth > 0) {\n    // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n    ctx.lineJoin = 'round';\n    ctx.miterLimit = 2;\n    ctx.lineWidth = options.textStrokeWidth;\n    ctx.strokeStyle = options.textStrokeColor;\n    return true;\n  }\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @returns {Point}\n */\nfunction getRectCenterPoint(rect) {\n  const {x, y, width, height} = rect;\n  return {\n    x: x + width / 2,\n    y: y + height / 2\n  };\n}\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  const cx = center.x;\n  const cy = center.y;\n\n  return {\n    x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n    y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n  };\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n  value = typeof value === 'number' ? value : scale.parse(value);\n  return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * @param {Scale} scale\n * @param {{start: number, end: number}} options\n * @returns {{start: number, end: number}}\n */\nfunction getChartDimensionByScale(scale, options) {\n  if (scale) {\n    const min = scaleValue(scale, options.min, options.start);\n    const max = scaleValue(scale, options.max, options.end);\n    return {\n      start: Math.min(min, max),\n      end: Math.max(min, max)\n    };\n  }\n  return {\n    start: options.start,\n    end: options.end\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n  const {chartArea, scales} = chart;\n  const xScale = scales[options.xScaleID];\n  const yScale = scales[options.yScaleID];\n  let x = chartArea.width / 2;\n  let y = chartArea.height / 2;\n\n  if (xScale) {\n    x = scaleValue(xScale, options.xValue, x);\n  }\n\n  if (yScale) {\n    y = scaleValue(yScale, options.yValue, y);\n  }\n  return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {{x?:number, y?: number, x2?: number, y2?: number, width?: number, height?: number}}\n */\nfunction getChartRect(chart, options) {\n  const xScale = chart.scales[options.xScaleID];\n  const yScale = chart.scales[options.yScaleID];\n  let {top: y, left: x, bottom: y2, right: x2} = chart.chartArea;\n\n  if (!xScale && !yScale) {\n    return {};\n  }\n\n  const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n  x = xDim.start;\n  x2 = xDim.end;\n  const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y, end: y2});\n  y = yDim.start;\n  y2 = yDim.end;\n\n  return {\n    x,\n    y,\n    x2,\n    y2,\n    width: x2 - x,\n    height: y2 - y\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions} options\n */\nfunction getChartCircle(chart, options) {\n  const point = getChartPoint(chart, options);\n  return {\n    x: point.x + options.xAdjust,\n    y: point.y + options.yAdjust,\n    width: options.radius * 2,\n    height: options.radius * 2\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions} options\n * @returns\n */\nfunction resolvePointPosition(chart, options) {\n  if (!isBoundToPoint(options)) {\n    const box = getChartRect(chart, options);\n    const point = getRectCenterPoint(box);\n    let radius = options.radius;\n    if (!radius || isNaN(radius)) {\n      radius = Math.min(box.width, box.height) / 2;\n      options.radius = radius;\n    }\n    return {\n      x: point.x + options.xAdjust,\n      y: point.y + options.yAdjust,\n      width: radius * 2,\n      height: radius * 2\n    };\n  }\n  return getChartCircle(chart, options);\n}\n\nclass BoxAnnotation extends Element {\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    return inBoxRange(x, y, this.getProps(['x', 'y', 'width', 'height'], useFinalPosition), this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    ctx.save();\n    translate(ctx, this, this.options.rotation);\n    drawBox(ctx, this, this.options);\n    ctx.restore();\n  }\n\n  drawLabel(ctx) {\n    const {x, y, width, height, options} = this;\n    const {label, borderWidth} = options;\n    const halfBorder = borderWidth / 2;\n    const position = toPosition(label.position);\n    const padding = toPadding(label.padding);\n    const labelSize = measureLabelSize(ctx, label);\n    const labelRect = {\n      x: calculateX(this, labelSize, position, padding),\n      y: calculateY(this, labelSize, position, padding),\n      width: labelSize.width,\n      height: labelSize.height\n    };\n\n    ctx.save();\n    translate(ctx, this, label.rotation);\n    ctx.beginPath();\n    ctx.rect(x + halfBorder + padding.left, y + halfBorder + padding.top,\n      width - borderWidth - padding.width, height - borderWidth - padding.height);\n    ctx.clip();\n    drawLabel(ctx, labelRect, label);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    return getChartRect(chart, options);\n  }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  cornerRadius: undefined, // TODO: v2 remove support for cornerRadius\n  display: true,\n  label: {\n    borderWidth: undefined,\n    color: 'black',\n    content: null,\n    drawTime: undefined,\n    enabled: false,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: undefined,\n    textAlign: 'start',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    xAdjust: 0,\n    yAdjust: 0,\n    width: undefined\n  },\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nBoxAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n  label: {\n    _fallback: true\n  }\n};\n\nfunction calculateX(box, labelSize, position, padding) {\n  const {x: start, x2: end, width: size, options} = box;\n  const {xAdjust: adjust, borderWidth} = options.label;\n  return calculatePosition$1({start, end, size}, {\n    position: position.x,\n    padding: {start: padding.left, end: padding.right},\n    adjust, borderWidth,\n    size: labelSize.width\n  });\n}\n\nfunction calculateY(box, labelSize, position, padding) {\n  const {y: start, y2: end, height: size, options} = box;\n  const {yAdjust: adjust, borderWidth} = options.label;\n  return calculatePosition$1({start, end, size}, {\n    position: position.y,\n    padding: {start: padding.top, end: padding.bottom},\n    adjust, borderWidth,\n    size: labelSize.height\n  });\n}\n\nfunction calculatePosition$1(boxOpts, labelOpts) {\n  const {start, end} = boxOpts;\n  const {position, padding: {start: padStart, end: padEnd}, adjust, borderWidth} = labelOpts;\n  const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n  return start + borderWidth / 2 + adjust + padStart + getRelativePosition(availableSize, position);\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst defaultEpsilon = 0.001;\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n  return !(\n    (x < left && x2 < left) ||\n    (x > right && x2 > right) ||\n    (y < top && y2 < top) ||\n    (y > bottom && y2 > bottom)\n  );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n  if (x < left) {\n    y = interpolateY(left, {x, y}, p2);\n    x = left;\n  }\n  if (x > right) {\n    y = interpolateY(right, {x, y}, p2);\n    x = right;\n  }\n  if (y < top) {\n    x = interpolateX(top, {x, y}, p2);\n    y = top;\n  }\n  if (y > bottom) {\n    x = interpolateX(bottom, {x, y}, p2);\n    y = bottom;\n  }\n  return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n  const {x, y} = limitPointToArea(p1, p2, area);\n  const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n  return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nclass LineAnnotation extends Element {\n\n  // TODO: make private in v2\n  intersects(x, y, epsilon = defaultEpsilon, useFinalPosition) {\n    // Adapted from https://stackoverflow.com/a/6853926/25507\n    const {x: x1, y: y1, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n    const dx = x2 - x1;\n    const dy = y2 - y1;\n    const lenSq = sqr(dx) + sqr(dy);\n    const t = lenSq === 0 ? -1 : ((x - x1) * dx + (y - y1) * dy) / lenSq;\n    let xx, yy;\n    if (t < 0) {\n      xx = x1;\n      yy = y1;\n    } else if (t > 1) {\n      xx = x2;\n      yy = y2;\n    } else {\n      xx = x1 + t * dx;\n      yy = y1 + t * dy;\n    }\n    return (sqr(x - xx) + sqr(y - yy)) <= epsilon;\n  }\n\n  /**\n   * @todo make private in v2\n   * @param {boolean} useFinalPosition - use the element's animation target instead of current position\n   * @param {top, right, bottom, left} [chartArea] - optional, area of the chart\n   * @returns {boolean} true if the label is visible\n   */\n  labelIsVisible(useFinalPosition, chartArea) {\n    const labelOpts = this.options.label;\n    if (!labelOpts || !labelOpts.enabled) {\n      return false;\n    }\n    return !chartArea || isLineInArea(this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), chartArea);\n  }\n\n  // TODO: make private in v2\n  isOnLabel(mouseX, mouseY, useFinalPosition) {\n    if (!this.labelIsVisible(useFinalPosition)) {\n      return false;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, labelRotation} = this.getProps(['labelX', 'labelY', 'labelWidth', 'labelHeight', 'labelRotation'], useFinalPosition);\n    const {x, y} = rotated({x: mouseX, y: mouseY}, {x: labelX, y: labelY}, -labelRotation);\n    const hBorderWidth = this.options.label.borderWidth / 2 || 0;\n    const w2 = labelWidth / 2 + hBorderWidth;\n    const h2 = labelHeight / 2 + hBorderWidth;\n    return x >= labelX - w2 - defaultEpsilon && x <= labelX + w2 + defaultEpsilon &&\n      y >= labelY - h2 - defaultEpsilon && y <= labelY + h2 + defaultEpsilon;\n  }\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const epsilon = sqr(this.options.borderWidth / 2);\n    return this.intersects(mouseX, mouseY, epsilon, useFinalPosition) || this.isOnLabel(mouseX, mouseY, useFinalPosition);\n  }\n\n  getCenterPoint() {\n    return {\n      x: (this.x2 + this.x) / 2,\n      y: (this.y2 + this.y) / 2\n    };\n  }\n\n  draw(ctx) {\n    const {x, y, x2, y2, options} = this;\n\n    ctx.save();\n    if (!setBorderStyle(ctx, options)) {\n      // no border width, then line is not drawn\n      return ctx.restore();\n    }\n    setShadowStyle(ctx, options);\n    const angle = Math.atan2(y2 - y, x2 - x);\n    const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n    const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n\n    ctx.translate(x, y);\n    ctx.rotate(angle);\n    ctx.beginPath();\n    ctx.moveTo(0 + startAdjust, 0);\n    ctx.lineTo(length - endAdjust, 0);\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n    drawArrowHead(ctx, 0, startAdjust, startOpts);\n    drawArrowHead(ctx, length, -endAdjust, endOpts);\n    ctx.restore();\n  }\n\n  drawLabel(ctx, chartArea) {\n    if (!this.labelIsVisible(false, chartArea)) {\n      return;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, labelRotation, labelPadding, labelTextSize, options: {label}} = this;\n\n    ctx.save();\n    ctx.translate(labelX, labelY);\n    ctx.rotate(labelRotation);\n\n    const boxRect = {\n      x: -(labelWidth / 2),\n      y: -(labelHeight / 2),\n      width: labelWidth,\n      height: labelHeight\n    };\n    drawBox(ctx, boxRect, label);\n\n    const labelTextRect = {\n      x: -(labelWidth / 2) + labelPadding.left + label.borderWidth / 2,\n      y: -(labelHeight / 2) + labelPadding.top + label.borderWidth / 2,\n      width: labelTextSize.width,\n      height: labelTextSize.height\n    };\n    drawLabel(ctx, labelTextRect, label);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const scale = chart.scales[options.scaleID];\n    let {top: y, left: x, bottom: y2, right: x2} = chart.chartArea;\n    let min, max;\n\n    if (scale) {\n      min = scaleValue(scale, options.value, NaN);\n      max = scaleValue(scale, options.endValue, min);\n      if (scale.isHorizontal()) {\n        x = min;\n        x2 = max;\n      } else {\n        y = min;\n        y2 = max;\n      }\n    } else {\n      const xScale = chart.scales[options.xScaleID];\n      const yScale = chart.scales[options.yScaleID];\n\n      if (xScale) {\n        x = scaleValue(xScale, options.xMin, x);\n        x2 = scaleValue(xScale, options.xMax, x2);\n      }\n\n      if (yScale) {\n        y = scaleValue(yScale, options.yMin, y);\n        y2 = scaleValue(yScale, options.yMax, y2);\n      }\n    }\n    const inside = isLineInArea({x, y, x2, y2}, chart.chartArea);\n    const properties = inside\n      ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n      : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n\n    const label = options.label;\n    if (label && label.content) {\n      return loadLabelRect(properties, chart, label);\n    }\n    return properties;\n  }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n  backgroundColor: undefined,\n  backgroundShadowColor: undefined,\n  borderColor: undefined,\n  borderDash: undefined,\n  borderDashOffset: undefined,\n  borderShadowColor: undefined,\n  borderWidth: undefined,\n  enabled: undefined,\n  fill: undefined,\n  length: undefined,\n  shadowBlur: undefined,\n  shadowOffsetX: undefined,\n  shadowOffsetY: undefined,\n  width: undefined\n};\n\nLineAnnotation.defaults = {\n  adjustScaleRange: true,\n  arrowHeads: {\n    enabled: false,\n    end: Object.assign({}, arrowHeadsDefaults),\n    fill: false,\n    length: 12,\n    start: Object.assign({}, arrowHeadsDefaults),\n    width: 6\n  },\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 2,\n  display: true,\n  endValue: undefined,\n  label: {\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    backgroundShadowColor: 'transparent',\n    borderCapStyle: 'butt',\n    borderColor: 'black',\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderRadius: 6,\n    borderShadowColor: 'transparent',\n    borderWidth: 0,\n    color: '#fff',\n    content: null,\n    cornerRadius: undefined, // TODO: v2 remove support for cornerRadius\n    drawTime: undefined,\n    enabled: false,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: 0,\n    shadowBlur: 0,\n    shadowOffsetX: 0,\n    shadowOffsetY: 0,\n    textAlign: 'center',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    width: undefined,\n    xAdjust: 0,\n    xPadding: undefined, // TODO: v2 remove support for xPadding\n    yAdjust: 0,\n    yPadding: undefined, // TODO: v2 remove support for yPadding\n  },\n  scaleID: undefined,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  value: undefined,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nLineAnnotation.descriptors = {\n  arrowHeads: {\n    start: {\n      _fallback: true\n    },\n    end: {\n      _fallback: true\n    },\n    _fallback: true\n  }\n};\n\nLineAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction loadLabelRect(line, chart, options) {\n  // TODO: v2 remove support for xPadding and yPadding\n  const {padding: lblPadding, xPadding, yPadding, borderWidth} = options;\n  const padding = getPadding(lblPadding, xPadding, yPadding);\n  const textSize = measureLabelSize(chart.ctx, options);\n  const width = textSize.width + padding.width + borderWidth;\n  const height = textSize.height + padding.height + borderWidth;\n  const labelRect = calculateLabelPosition(line, options, {width, height, padding}, chart.chartArea);\n  line.labelX = labelRect.x;\n  line.labelY = labelRect.y;\n  line.labelWidth = labelRect.width;\n  line.labelHeight = labelRect.height;\n  line.labelRotation = labelRect.rotation;\n  line.labelPadding = padding;\n  line.labelTextSize = textSize;\n  return line;\n}\n\nfunction calculateAutoRotation(line) {\n  const {x, y, x2, y2} = line;\n  const rotation = Math.atan2(y2 - y, x2 - x);\n  // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n  return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\n// TODO: v2 remove support for xPadding and yPadding\nfunction getPadding(padding, xPadding, yPadding) {\n  let tempPadding = padding;\n  if (xPadding || yPadding) {\n    tempPadding = {x: xPadding || 6, y: yPadding || 6};\n  }\n  return toPadding(tempPadding);\n}\n\nfunction calculateLabelPosition(line, label, sizes, chartArea) {\n  const {width, height, padding} = sizes;\n  const {xAdjust, yAdjust} = label;\n  const p1 = {x: line.x, y: line.y};\n  const p2 = {x: line.x2, y: line.y2};\n  const rotation = label.rotation === 'auto' ? calculateAutoRotation(line) : toRadians(label.rotation);\n  const size = rotatedSize(width, height, rotation);\n  const t = calculateT(line, label, {labelSize: size, padding}, chartArea);\n  const pt = pointInLine(p1, p2, t);\n  const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n  const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n\n  return {\n    x: adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust,\n    y: adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust,\n    width,\n    height,\n    rotation\n  };\n}\n\nfunction rotatedSize(width, height, rotation) {\n  const cos = Math.cos(rotation);\n  const sin = Math.sin(rotation);\n  return {\n    w: Math.abs(width * cos) + Math.abs(height * sin),\n    h: Math.abs(width * sin) + Math.abs(height * cos)\n  };\n}\n\nfunction calculateT(line, label, sizes, chartArea) {\n  let t;\n  const space = spaceAround(line, chartArea);\n  if (label.position === 'start') {\n    t = calculateTAdjust({w: line.x2 - line.x, h: line.y2 - line.y}, sizes, label, space);\n  } else if (label.position === 'end') {\n    t = 1 - calculateTAdjust({w: line.x - line.x2, h: line.y - line.y2}, sizes, label, space);\n  } else {\n    t = getRelativePosition(1, label.position);\n  }\n  return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n  const {labelSize, padding} = sizes;\n  const lineW = lineSize.w * space.dx;\n  const lineH = lineSize.h * space.dy;\n  const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n  const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n  return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(line, chartArea) {\n  const {x, x2, y, y2} = line;\n  const t = Math.min(y, y2) - chartArea.top;\n  const l = Math.min(x, x2) - chartArea.left;\n  const b = chartArea.bottom - Math.max(y, y2);\n  const r = chartArea.right - Math.max(x, x2);\n  return {\n    x: Math.min(l, r),\n    y: Math.min(t, b),\n    dx: l <= r ? 1 : -1,\n    dy: t <= b ? 1 : -1\n  };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n  const {size, min, max, padding} = labelSizes;\n  const halfSize = size / 2;\n  if (size > max - min) {\n    // if it does not fit, display as much as possible\n    return (max + min) / 2;\n  }\n  if (min >= (coordinate - padding - halfSize)) {\n    coordinate = min + padding + halfSize;\n  }\n  if (max <= (coordinate + padding + halfSize)) {\n    coordinate = max - padding - halfSize;\n  }\n  return coordinate;\n}\n\nfunction getArrowHeads(line) {\n  const options = line.options;\n  const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n  const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n  return {\n    startOpts: arrowStartOpts,\n    endOpts: arrowEndOpts,\n    startAdjust: getLineAdjust(line, arrowStartOpts),\n    endAdjust: getLineAdjust(line, arrowEndOpts)\n  };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.enabled) {\n    return 0;\n  }\n  const {length, width} = arrowOpts;\n  const adjust = line.options.borderWidth / 2;\n  const p1 = {x: length, y: width + adjust};\n  const p2 = {x: 0, y: adjust};\n  return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.enabled) {\n    return;\n  }\n  const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n  const arrowOffsetX = Math.abs(offset - length) + adjust;\n  ctx.beginPath();\n  setShadowStyle(ctx, arrowOpts);\n  setBorderStyle(ctx, arrowOpts);\n  ctx.moveTo(arrowOffsetX, -width);\n  ctx.lineTo(offset + adjust, 0);\n  ctx.lineTo(arrowOffsetX, width);\n  if (fill === true) {\n    ctx.fillStyle = backgroundColor || borderColor;\n    ctx.closePath();\n    ctx.fill();\n    ctx.shadowColor = 'transparent';\n  } else {\n    ctx.shadowColor = arrowOpts.borderShadowColor;\n  }\n  ctx.stroke();\n}\n\nclass EllipseAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height'], useFinalPosition), this.options.rotation, this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    const {width, height, options} = this;\n    const center = this.getCenterPoint();\n\n    ctx.save();\n    translate(ctx, this, options.rotation);\n    setShadowStyle(ctx, this.options);\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    const stroke = setBorderStyle(ctx, options);\n    ctx.ellipse(center.x, center.y, height / 2, width / 2, PI / 2, 0, 2 * PI);\n    ctx.fill();\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    return getChartRect(chart, options);\n  }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nEllipseAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nfunction pointInEllipse(p, ellipse, rotation, borderWidth) {\n  const {width, height} = ellipse;\n  const center = ellipse.getCenterPoint(true);\n  const xRadius = width / 2;\n  const yRadius = height / 2;\n\n  if (xRadius <= 0 || yRadius <= 0) {\n    return false;\n  }\n  // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n  const angle = toRadians(rotation || 0);\n  const hBorderWidth = borderWidth / 2 || 0;\n  const cosAngle = Math.cos(angle);\n  const sinAngle = Math.sin(angle);\n  const a = Math.pow(cosAngle * (p.x - center.x) + sinAngle * (p.y - center.y), 2);\n  const b = Math.pow(sinAngle * (p.x - center.x) - cosAngle * (p.y - center.y), 2);\n  return (a / Math.pow(xRadius + hBorderWidth, 2)) + (b / Math.pow(yRadius + hBorderWidth, 2)) <= 1.0001;\n}\n\nclass LabelAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    return inBoxRange(x, y, this.getProps(['x', 'y', 'width', 'height'], useFinalPosition), this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    if (!this.options.content) {\n      return;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, options} = this;\n    ctx.save();\n    translate(ctx, this, options.rotation);\n    drawCallout(ctx, this);\n    drawBox(ctx, this, options);\n    drawLabel(ctx, {x: labelX, y: labelY, width: labelWidth, height: labelHeight}, options);\n    ctx.restore();\n  }\n\n  // TODO: make private in v2\n  resolveElementProperties(chart, options) {\n    const point = !isBoundToPoint(options) ? getRectCenterPoint(getChartRect(chart, options)) : getChartPoint(chart, options);\n    const padding = toPadding(options.padding);\n    const labelSize = measureLabelSize(chart.ctx, options);\n    const boxSize = measureRect(point, labelSize, options, padding);\n    const hBorderWidth = options.borderWidth / 2;\n    const properties = {\n      pointX: point.x,\n      pointY: point.y,\n      ...boxSize,\n      labelX: boxSize.x + padding.left + hBorderWidth,\n      labelY: boxSize.y + padding.top + hBorderWidth,\n      labelWidth: labelSize.width,\n      labelHeight: labelSize.height\n    };\n    properties.calloutPosition = options.callout.enabled && resolveCalloutPosition(properties, options.callout, options.rotation);\n    return properties;\n  }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundColor: 'transparent',\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 0,\n  callout: {\n    borderCapStyle: 'butt',\n    borderColor: undefined,\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderWidth: 1,\n    enabled: false,\n    margin: 5,\n    position: 'auto',\n    side: 5,\n    start: '50%',\n  },\n  color: 'black',\n  content: null,\n  display: true,\n  font: {\n    family: undefined,\n    lineHeight: undefined,\n    size: undefined,\n    style: undefined,\n    weight: undefined\n  },\n  height: undefined,\n  padding: 6,\n  position: 'center',\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  textAlign: 'center',\n  textStrokeColor: undefined,\n  textStrokeWidth: 0,\n  width: undefined,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nLabelAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction measureRect(point, size, options, padding) {\n  const width = size.width + padding.width + options.borderWidth;\n  const height = size.height + padding.height + options.borderWidth;\n  const position = toPosition(options.position);\n\n  return {\n    x: calculatePosition(point.x, width, options.xAdjust, position.x),\n    y: calculatePosition(point.y, height, options.yAdjust, position.y),\n    width,\n    height\n  };\n}\n\nfunction calculatePosition(start, size, adjust = 0, position) {\n  return start - getRelativePosition(size, position) + adjust;\n}\n\nfunction drawCallout(ctx, element) {\n  const {pointX, pointY, calloutPosition, options} = element;\n  if (!calloutPosition || element.inRange(pointX, pointY)) {\n    return;\n  }\n  const callout = options.callout;\n\n  ctx.save();\n  ctx.beginPath();\n  const stroke = setBorderStyle(ctx, callout);\n  if (!stroke) {\n    return ctx.restore();\n  }\n  const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n  const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n  if (callout.margin > 0 || options.borderWidth === 0) {\n    ctx.moveTo(separatorStart.x, separatorStart.y);\n    ctx.lineTo(separatorEnd.x, separatorEnd.y);\n  }\n  ctx.moveTo(sideStart.x, sideStart.y);\n  ctx.lineTo(sideEnd.x, sideEnd.y);\n  const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-options.rotation));\n  ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n  ctx.stroke();\n  ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n  const {x, y, width, height} = element;\n  const adjust = getCalloutSeparatorAdjust(element, position);\n  let separatorStart, separatorEnd;\n  if (position === 'left' || position === 'right') {\n    separatorStart = {x: x + adjust, y};\n    separatorEnd = {x: separatorStart.x, y: separatorStart.y + height};\n  } else {\n    //  position 'top' or 'bottom'\n    separatorStart = {x, y: y + adjust};\n    separatorEnd = {x: separatorStart.x + width, y: separatorStart.y};\n  }\n  return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n  const {width, height, options} = element;\n  const adjust = options.callout.margin + options.borderWidth / 2;\n  if (position === 'right') {\n    return width + adjust;\n  } else if (position === 'bottom') {\n    return height + adjust;\n  }\n  return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n  const {y, width, height, options} = element;\n  const start = options.callout.start;\n  const side = getCalloutSideAdjust(position, options.callout);\n  let sideStart, sideEnd;\n  if (position === 'left' || position === 'right') {\n    sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n    sideEnd = {x: sideStart.x + side, y: sideStart.y};\n  } else {\n    //  position 'top' or 'bottom'\n    sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n    sideEnd = {x: sideStart.x, y: sideStart.y + side};\n  }\n  return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n  const side = options.side;\n  if (position === 'left' || position === 'top') {\n    return -side;\n  }\n  return side;\n}\n\nfunction resolveCalloutPosition(properties, options, rotation) {\n  const position = options.position;\n  if (position === 'left' || position === 'right' || position === 'top' || position === 'bottom') {\n    return position;\n  }\n  return resolveCalloutAutoPosition(properties, options, rotation);\n}\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\nfunction resolveCalloutAutoPosition(properties, options, rotation) {\n  const {x, y, width, height, pointX, pointY} = properties;\n  const center = {x: x + width / 2, y: y + height / 2};\n  const start = options.start;\n  const xAdjust = getSize(width, start);\n  const yAdjust = getSize(height, start);\n  const xPoints = [x, x + xAdjust, x + xAdjust, x + width];\n  const yPoints = [y + yAdjust, y + height, y, y + yAdjust];\n  const result = [];\n  for (let index = 0; index < 4; index++) {\n    const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n    result.push({\n      position: positions[index],\n      distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n    });\n  }\n  return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nclass PointAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {width} = this.getProps(['width'], useFinalPosition);\n    return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const options = this.options;\n    const borderWidth = options.borderWidth;\n    if (options.radius < 0.1) {\n      return;\n    }\n    ctx.save();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    options.borderWidth = 0;\n    drawPoint(ctx, options, this.x, this.y);\n    if (stroke && !isImageOrCanvas(options.pointStyle)) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n    options.borderWidth = borderWidth;\n  }\n\n  resolveElementProperties(chart, options) {\n    return resolvePointPosition(chart, options);\n  }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  pointStyle: 'circle',\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nPointAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const {elements, options} = this;\n    ctx.save();\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    let first = true;\n    for (const el of elements) {\n      if (first) {\n        ctx.moveTo(el.x, el.y);\n        first = false;\n      } else {\n        ctx.lineTo(el.x, el.y);\n      }\n    }\n    ctx.closePath();\n    ctx.fill();\n    // If no border, don't draw it\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const {x, y, width, height} = resolvePointPosition(chart, options);\n    const {sides, radius, rotation, borderWidth} = options;\n    const halfBorder = borderWidth / 2;\n    const elements = [];\n    const angle = (2 * PI) / sides;\n    let rad = rotation * RAD_PER_DEG;\n    for (let i = 0; i < sides; i++, rad += angle) {\n      const sin = Math.sin(rad);\n      const cos = Math.cos(rad);\n      elements.push({\n        type: 'point',\n        optionScope: 'point',\n        properties: {\n          x: x + sin * radius,\n          y: y - cos * radius,\n          bX: x + sin * (radius + halfBorder),\n          bY: y - cos * (radius + halfBorder)\n        }\n      });\n    }\n    return {x, y, width, height, elements, initProperties: {x, y}};\n  }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  point: {\n    radius: 0\n  },\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  sides: 3,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nPolygonAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n  let isInside = false;\n  let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n  for (const point of points) {\n    const B = point.getProps(['bX', 'bY'], useFinalPosition);\n    if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n      isInside = !isInside;\n    }\n    A = B;\n  }\n  return isInside;\n}\n\nconst annotationTypes = {\n  box: BoxAnnotation,\n  ellipse: EllipseAnnotation,\n  label: LabelAnnotation,\n  line: LineAnnotation,\n  point: PointAnnotation,\n  polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n  defaults.describe(`elements.${annotationTypes[key].id}`, {\n    _fallback: 'plugins.annotation'\n  });\n});\n\nconst directUpdater = {\n  update: Object.assign\n};\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n  if (annotationTypes[type]) {\n    return type;\n  }\n  console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n  return 'line';\n}\n\n/**\n * Create or update all annotation elements, configured to the plugin.\n * @param {Chart} chart - the chart where the plugin is enabled\n * @param {Object} state - the state of the plugin\n * @param {Object} options - annotation options to use\n * @param {UpdateMode} mode - The update mode\n */\nfunction updateElements(chart, state, options, mode) {\n  const animations = resolveAnimations(chart, options.animations, mode);\n\n  const annotations = state.annotations;\n  const elements = resyncElements(state.elements, annotations);\n\n  for (let i = 0; i < annotations.length; i++) {\n    const annotationOptions = annotations[i];\n    const element = getOrCreateElement(elements, i, annotationOptions.type);\n    const resolver = annotationOptions.setContext(getContext(chart, element, annotationOptions));\n    const properties = element.resolveElementProperties(chart, resolver);\n\n    properties.skip = toSkip(properties);\n\n    if ('elements' in properties) {\n      updateSubElements(element, properties, resolver, animations);\n      // Remove the sub-element definitions from properties, so the actual elements\n      // are not overwritten by their definitions\n      delete properties.elements;\n    }\n\n    if (!defined(element.x)) {\n      // If the element is newly created, assing the properties directly - to\n      // make them readily awailable to any scriptable options. If we do not do this,\n      // the properties retruned by `resolveElementProperties` are available only\n      // after options resolution.\n      Object.assign(element, properties);\n    }\n\n    properties.options = resolveAnnotationOptions(resolver);\n\n    animations.update(element, properties);\n  }\n}\n\nfunction toSkip(properties) {\n  return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n  if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n    return directUpdater;\n  }\n  return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, {elements, initProperties}, resolver, animations) {\n  const subElements = mainElement.elements || (mainElement.elements = []);\n  subElements.length = elements.length;\n  for (let i = 0; i < elements.length; i++) {\n    const definition = elements[i];\n    const properties = definition.properties;\n    const subElement = getOrCreateElement(subElements, i, definition.type, initProperties);\n    const subResolver = resolver[definition.optionScope].override(definition);\n    properties.options = resolveAnnotationOptions(subResolver);\n    animations.update(subElement, properties);\n  }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n  const elementClass = annotationTypes[resolveType(type)];\n  let element = elements[index];\n  if (!element || !(element instanceof elementClass)) {\n    element = elements[index] = new elementClass();\n    if (isObject(initProperties)) {\n      Object.assign(element, initProperties);\n    }\n  }\n  return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n  const elementClass = annotationTypes[resolveType(resolver.type)];\n  const result = {};\n  result.id = resolver.id;\n  result.type = resolver.type;\n  result.drawTime = resolver.drawTime;\n  Object.assign(result,\n    resolveObj(resolver, elementClass.defaults),\n    resolveObj(resolver, elementClass.defaultRoutes));\n  for (const hook of hooks) {\n    result[hook] = resolver[hook];\n  }\n  return result;\n}\n\nfunction resolveObj(resolver, defs) {\n  const result = {};\n  for (const prop of Object.keys(defs)) {\n    const optDefs = defs[prop];\n    const value = resolver[prop];\n    result[prop] = isObject(optDefs) ? resolveObj(value, optDefs) : value;\n  }\n  return result;\n}\n\nfunction getContext(chart, element, annotation) {\n  return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n    element,\n    id: annotation.id,\n    type: 'annotation'\n  }));\n}\n\nfunction resyncElements(elements, annotations) {\n  const count = annotations.length;\n  const start = elements.length;\n\n  if (start < count) {\n    const add = count - start;\n    elements.splice(start, 0, ...new Array(add));\n  } else if (start > count) {\n    elements.splice(count, start - count);\n  }\n  return elements;\n}\n\nvar name = \"chartjs-plugin-annotation\";\nvar version = \"1.4.0\";\n\nconst chartStates = new Map();\n\nvar annotation = {\n  id: 'annotation',\n\n  version,\n\n  /* TODO: enable in v2\n  beforeRegister() {\n    requireVersion('chart.js', '3.7', Chart.version);\n  },\n  */\n\n  afterRegister() {\n    Chart.register(annotationTypes);\n\n    // TODO: Remove this check, warning and workaround in v2\n    if (!requireVersion('chart.js', '3.7', Chart.version, false)) {\n      console.warn(`${name} has known issues with chart.js versions prior to 3.7, please consider upgrading.`);\n\n      // Workaround for https://github.com/chartjs/chartjs-plugin-annotation/issues/572\n      Chart.defaults.set('elements.lineAnnotation', {\n        callout: {},\n        font: {},\n        padding: 6\n      });\n    }\n  },\n\n  afterUnregister() {\n    Chart.unregister(annotationTypes);\n  },\n\n  beforeInit(chart) {\n    chartStates.set(chart, {\n      annotations: [],\n      elements: [],\n      visibleElements: [],\n      listeners: {},\n      listened: false,\n      moveListened: false\n    });\n  },\n\n  beforeUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    const annotations = state.annotations = [];\n\n    let annotationOptions = options.annotations;\n    if (isObject(annotationOptions)) {\n      Object.keys(annotationOptions).forEach(key => {\n        const value = annotationOptions[key];\n        if (isObject(value)) {\n          value.id = key;\n          annotations.push(value);\n        }\n      });\n    } else if (isArray(annotationOptions)) {\n      annotations.push(...annotationOptions);\n    }\n    verifyScaleOptions(annotations, chart.scales);\n  },\n\n  afterDataLimits(chart, args) {\n    const state = chartStates.get(chart);\n    adjustScaleRange(chart, args.scale, state.annotations.filter(a => a.display && a.adjustScaleRange));\n  },\n\n  afterUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    updateListeners(chart, state, options);\n    updateElements(chart, state, options, args.mode);\n    state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n  },\n\n  beforeDatasetsDraw(chart, _args, options) {\n    draw(chart, 'beforeDatasetsDraw', options.clip);\n  },\n\n  afterDatasetsDraw(chart, _args, options) {\n    draw(chart, 'afterDatasetsDraw', options.clip);\n  },\n\n  beforeDraw(chart, _args, options) {\n    draw(chart, 'beforeDraw', options.clip);\n  },\n\n  afterDraw(chart, _args, options) {\n    draw(chart, 'afterDraw', options.clip);\n  },\n\n  beforeEvent(chart, args, options) {\n    const state = chartStates.get(chart);\n    handleEvent(state, args.event, options);\n  },\n\n  destroy(chart) {\n    chartStates.delete(chart);\n  },\n\n  _getState(chart) {\n    return chartStates.get(chart);\n  },\n\n  defaults: {\n    animations: {\n      numbers: {\n        properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'pointX', 'pointY', 'labelX', 'labelY', 'labelWidth', 'labelHeight', 'radius'],\n        type: 'number'\n      },\n    },\n    clip: true,\n    dblClickSpeed: 350, // ms\n    drawTime: 'afterDatasetsDraw',\n    label: {\n      drawTime: null\n    }\n  },\n\n  descriptors: {\n    _indexable: false,\n    _scriptable: (prop) => !hooks.includes(prop),\n    annotations: {\n      _allKeys: false,\n      _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`,\n    },\n  },\n\n  additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n  const {ctx, chartArea} = chart;\n  const {visibleElements} = chartStates.get(chart);\n\n  if (clip) {\n    clipArea(ctx, chartArea);\n  }\n\n  drawElements(ctx, visibleElements, caller);\n  drawSubElements(ctx, visibleElements, caller);\n\n  if (clip) {\n    unclipArea(ctx);\n  }\n\n  visibleElements.forEach(el => {\n    if (!('drawLabel' in el)) {\n      return;\n    }\n    const label = el.options.label;\n    if (label && label.enabled && label.content && (label.drawTime || el.options.drawTime) === caller) {\n      el.drawLabel(ctx, chartArea);\n    }\n  });\n}\n\nfunction drawElements(ctx, elements, caller) {\n  for (const el of elements) {\n    if (el.options.drawTime === caller) {\n      el.draw(ctx);\n    }\n  }\n}\n\nfunction drawSubElements(ctx, elements, caller) {\n  for (const el of elements) {\n    if (isArray(el.elements)) {\n      drawElements(ctx, el.elements, caller);\n    }\n  }\n}\n\nexport { annotation as default };\n","<script>\n    import { onMount } from \"svelte\";\n    import { Chart, registerables } from \"chart.js\";\n    import annotationPlugin from \"chartjs-plugin-annotation\";\n\n    Chart.register(...registerables);\n    Chart.register(annotationPlugin);\n\n    let canvas;\n    let chart;\n    let ctx;\n    export let line_value = 25;\n    export let chart_data;\n    export let selected_prop;\n    export let league = \"nba\";\n    $: if(chart) updateChart(chart, false, line_value);\n    $: if(chart) updateChart(chart, true, chart_data, selected_prop);\n    function getChartData() {\n        let labels = [];\n        let data = [];\n        if(league == \"nba\"){\n            //add points+rebounds+assists and blocks+steals to data\n            for (var stat_entry of chart_data) {\n                stat_entry[\"points+reb+ast\"] = parseInt(stat_entry[\"points\"]) + parseInt(stat_entry[\"rebounds\"]) + parseInt(stat_entry[\"assists\"]);\n                stat_entry[\"steals+blocks\"] = parseInt(stat_entry[\"blocks\"]) + parseInt(stat_entry[\"steals\"]);\n            }\n        }\n        else if (league == \"mlb\"){\n            for (var stat_entry of chart_data) {\n                // check if stat_entry contains the prop strikouts so that we can distinguish pitchers from batters\n                stat_entry[\"earned runs\"] = parseInt(stat_entry[\"earned_runs\"]);\n                stat_entry[\"hits allowed\"] = parseInt(stat_entry[\"hits_allowed\"]);\n                stat_entry[\"walks allowed\"] = parseInt(stat_entry[\"walks_allowed\"]);\n                stat_entry[\"innings pitched\"] = parseFloat(stat_entry[\"innings_pitched\"]);\n\n                stat_entry[\"total bases\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) * 2 + parseInt(stat_entry.triples) * 3  + parseInt(stat_entry.homeruns) * 4;\n                stat_entry[\"runs+rbis\"] = parseInt(stat_entry.runs) + parseInt(stat_entry.rbis);\n                stat_entry[\"hits\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) + parseInt(stat_entry.triples) + parseInt(stat_entry.homeruns);\n                stat_entry[\"hits+walks\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) + parseInt(stat_entry.triples)  + parseInt(stat_entry.homeruns) + parseInt(stat_entry.walks);\n            }\n        }\n        else if(league == \"nhl\"){\n            for(var stat_entry of chart_data){\n                stat_entry[\"points\"] = parseInt(stat_entry.goals) + parseInt(stat_entry.assists);\n                stat_entry[\"shots on goal\"] = parseInt(stat_entry.shots);\n                stat_entry[\"blocked shots\"] = parseInt(stat_entry.blocked_shots);\n                stat_entry[\"power play points\"] = parseInt(stat_entry.power_play_goals) + parseInt(stat_entry.power_play_assists);\n                stat_entry[\"shots against\"] = parseInt(stat_entry.shots_against);\n                stat_entry[\"goals against\"] = parseInt(stat_entry.goals_against);\n            }\n        }\n        else if(league == \"nfl\"){\n            for(var stat_entry of chart_data){\n                stat_entry[\"rush yards\"] = parseInt(stat_entry.rush_yards);\n                stat_entry[\"pass yards\"] = parseInt(stat_entry.pass_yards);\n                stat_entry[\"rec yards\"] = parseInt(stat_entry.rec_yards);\n                stat_entry[\"rush tds\"] = parseInt(stat_entry.rush_tds);\n                stat_entry[\"pass tds\"] = parseInt(stat_entry.pass_tds);\n                stat_entry[\"rec tds\"] = parseInt(stat_entry.rec_tds);\n                stat_entry[\"total yards\"] = parseInt(stat_entry.rush_yards) + parseInt(stat_entry.pass_yards) + parseInt(stat_entry.rec_yards);\n                stat_entry[\"total tds\"] = parseInt(stat_entry.rush_tds) + parseInt(stat_entry.pass_tds) + parseInt(stat_entry.rec_tds);\n                stat_entry[\"interceptions\"] = parseInt(stat_entry.off_interceptions);\n            }\n        }\n        for (var game of chart_data){\n            labels.unshift(new Date(game.player_game.game.start_time.replace(/-/g, \"/\")).toLocaleDateString(\"default\",{month:'short', day:\"numeric\"}));\n            data.unshift(parseFloat(game[selected_prop]));\n        }\n        return {\n            labels: labels,\n            datasets: [\n                {\n                    backgroundColor: [\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(54, 162, 235)\",\n                        \"rgb(54, 162, 235)\",\n                        \"rgb(54, 162, 235)\",\n                    ],\n                    data: data,\n                },\n            ],\n        };\n    }\n    function getChartOptions() {\n        let annotations = {};\n        //check if line_value is not null\n        if(line_value){\n            annotations = {\n                line1: {\n                    type: \"line\",\n                    yMin: line_value,\n                    yMax: line_value,\n                    borderDash: [10, 10],\n                    borderColor: \"gray\",\n                    borderWidth: 2,\n                },\n            }\n        }\n        else{\n            annotations = {\n            }\n        }\n        return {\n            plugins: {\n                legend: {\n                    display: false\n                },\n                annotation: {\n                    annotations: annotations,\n                },\n            },\n        };\n    }\n    function setColors(myChart){\n        var bars = myChart.data.datasets[0].data;\n        for (let i = 0; i < bars.length; i++) {\n            if (bars[i] < line_value) {\n                myChart.data.datasets[0].backgroundColor[i] = 'rgb(255, 99, 132)';\n            } else if (bars[i] > line_value) {\n                myChart.data.datasets[0].backgroundColor[i] = \"#4CB963\";\n            } else {\n                myChart.data.datasets[0].backgroundColor[i] = \"gray\";\n            }\n        }\n    }\n    function updateChart(myChart, updateData = false) {\n        if (updateData) {\n            myChart.data = getChartData();\n        }\n        setColors(myChart);\n        myChart.options = getChartOptions();\n        myChart.update();\n    }\n    function initChart() {\n        ctx = canvas.getContext(\"2d\");\n        chart = new Chart(ctx, {\n            type: \"bar\",\n            data: getChartData(),\n            options: getChartOptions(),\n        });\n        setColors(chart);\n        chart.update();\n    }\n    onMount(() => {\n        initChart();\n    });\n</script>\n\n<canvas style=\"max-height:250px;\" bind:this={canvas} />\n","<script>\n    export let title_text = \"\";\n    export let text = \"\";\n    export let logo_url = \"\";\n</script>\n<div class=\"p-1 text-center\">\n    <img width=\"200\" height=\"188\" class=\"d-block mx-auto img-fluid\" src=\"{logo_url}\" alt=\"DFStud's cartoon horse mascot Studly\"\n        style=\"max-width: 200px;\">\n    <div class=\"col-lg-6 mx-auto p-2 glass\">\n        <h1 class=\"display-5 fw-bold\">{title_text}</h1>\n        <p class=\"lead\">{@html text}</p>\n    </div>\n</div>","<script>\n\timport gaussian from 'gaussian';\n\timport OverUnderChart from './OverUnderChart.svelte';\n\timport PremiumOnly from \"./PremiumOnly.svelte\";\n\texport let stats = [];\n\texport let gamelog = [];\n\t//not needed iterate over stats instead\n\texport let props = [\"points\", \"rebounds\", \"assists\", \"fantasy points\", \"points+rebounds+assists\", \"steals+blocks\"];\n\texport let league = \"nba\";\n\texport let premium_membership = true;\n\t// {stat: {lines: [...], p_over: [...], mean, sd}} from the fair-odds API\n\texport let fair_odds = null;\n\t// {stat: [{book, line, over, under, p_over, over_link, under_link}]} sportsbook lines for this game\n\texport let market_lines = null;\n\t$: market = marketRows(selected_prop, market_lines, my_dist, value_to_beat);\n\t// The number in the box means \"this many or more\", so for 3 assists the\n\t// bettable line is Over 2.5 (and 3.0 where a book posts whole numbers).\n\t// When no book posts that, the nearest posted lines are shown instead.\n\tfunction marketRows(prop, lines, dist, value) {\n\t\tif (!lines || !lines[prop] || !dist) return {rows: [], exact: true, lines: 0};\n\t\tlet all = lines[prop];\n\t\tlet at_value = all.filter(r => r.line <= value + 1e-9 && r.line >= value - 0.5 - 1e-9);\n\t\tlet exact = at_value.length > 0;\n\t\tlet chosen = at_value;\n\t\tif (!exact) {\n\t\t\tlet nearest = all.map(r => Math.abs(r.line - value)).sort((a, b) => a - b)[0];\n\t\t\tchosen = all.filter(r => Math.abs(Math.abs(r.line - value) - nearest) < 1e-9);\n\t\t}\n\t\tlet rows = chosen.map(r => {\n\t\t\tlet p_over = 1 - dist.cdf(r.line);\n\t\t\tlet over_ev = r.over !== null ? p_over * decimalOdds(r.over) - 1 : null;\n\t\t\tlet under_ev = r.under !== null ? (1 - p_over) * decimalOdds(r.under) - 1 : null;\n\t\t\tlet best = Math.max(over_ev === null ? -Infinity : over_ev, under_ev === null ? -Infinity : under_ev);\n\t\t\treturn {\n\t\t\t\tbook: r.book, line: r.line, over: r.over, under: r.under,\n\t\t\t\tover_link: r.over_link, under_link: r.under_link,\n\t\t\t\tbook_p: r.p_over, model_p: p_over, over_ev, under_ev, best,\n\t\t\t\tpick: best === over_ev ? \"Over\" : \"Under\",\n\t\t\t};\n\t\t});\n\t\trows.sort((a, b) => b.best - a.best);\n\t\tlet best_over = Math.max(...rows.filter(r => r.over !== null).map(r => r.over));\n\t\tlet best_under = Math.max(...rows.filter(r => r.under !== null).map(r => r.under));\n\t\trows.forEach(r => {\n\t\t\tr.top_over = r.over !== null && r.over === best_over && rows.filter(x => x.over !== null).length > 1;\n\t\t\tr.top_under = r.under !== null && r.under === best_under && rows.filter(x => x.under !== null).length > 1;\n\t\t});\n\t\treturn {rows, exact, lines: all.length};\n\t}\n\tfunction decimalOdds(o) { return o > 0 ? 1 + o / 100 : 1 + 100 / Math.abs(o); }\n\tfunction fmtOdds(o) { return (o > 0 ? \"+\" : \"\") + o; }\n\tfunction fmtEv(ev) { return (ev > 0 ? \"+\" : \"\") + (ev * 100).toFixed(1) + \"%\"; }\n\t$: setPropMetrics(stats, fair_odds);\n\tlet using_curve = false;\n\tlet selected_prop;\n\tlet value_to_beat;\n\tlet min_value;\n\tlet max_value;\n\tlet my_dist;\n\tlet probability;\n\tselected_prop = props[0];\n\tsetPropMetrics();\n\tfunction probabilityToMoneyLine(probability) {\n\t\tif (probability > 0.5) {\n\t\t\treturn \"-\" + Math.round((probability / (1 - probability)) * 100);\n\t\t}\n\t\telse{\n\t\t\treturn \"+\" + Math.round(((1-probability) / probability) * 100);\n\t\t}\n\t\t\n\t}\n\tfunction setPropMetrics(){\n\t\t//check if props contains selected_prop\n\t\tif (!props.includes(selected_prop)) {\n\t\t\tselected_prop = props[0];\n\t\t}\n\t\tlet my_prop = stats.find(obj => {return obj.name === selected_prop});\n\t\tmy_prop.projection = parseFloat(my_prop.projection);\n\t\tlet curve = fair_odds ? fair_odds[selected_prop] : null;\n\t\tusing_curve = !!(curve && curve.lines && curve.lines.length);\n\t\tlet sd = using_curve ? curve.sd : my_prop.sd;\n\t\tvalue_to_beat = roundHalf(my_prop.projection);\n\t\tmin_value = roundHalf(my_prop.projection - sd * 2);\n\t\tif (min_value < 0) {\n\t\t\tmin_value = 0;\n\t\t}\n\t\tmax_value = roundHalf(my_prop.projection + sd * 2);\n\t\t// The curve is the empirical distribution of what happened in past games\n\t\t// projected like this one (see fantasy/fair_odds.py); cdf(x) = P(under x)\n\t\tmy_dist = using_curve ? curveDist(curve) : new gaussian(my_prop.projection, my_prop.sd * my_prop.sd);\n\t\tprobability = my_dist.cdf(value_to_beat);\n\t}\n\tfunction curveDist(curve) {\n\t\tlet lines = curve.lines;\n\t\tlet p_over = curve.p_over;\n\t\tlet step = lines.length > 1 ? lines[1] - lines[0] : 0.5;\n\t\treturn {\n\t\t\tcdf: function(x) {\n\t\t\t\tlet over;\n\t\t\t\tif (x < lines[0]) {\n\t\t\t\t\tover = 1 - (1 - p_over[0]) * (x / lines[0]);\n\t\t\t\t} else if (x >= lines[lines.length - 1]) {\n\t\t\t\t\tover = p_over[p_over.length - 1];\n\t\t\t\t} else {\n\t\t\t\t\tlet i = Math.floor((x - lines[0]) / step);\n\t\t\t\t\tlet frac = (x - lines[i]) / step;\n\t\t\t\t\tover = p_over[i] + (p_over[i + 1] - p_over[i]) * frac;\n\t\t\t\t}\n\t\t\t\treturn 1 - over;\n\t\t\t}\n\t\t};\n\t}\n\tfunction roundHalf(num) {\n        return Math.round(num*2)/2;\n\t}\n</script>\n<style>\n\t.market-table td, .market-table th { padding: .3rem .3rem; }\n\t.book-name { font-size: .85rem; line-height: 1.1; }\n\t@media (max-width: 575px) {\n\t\t.market-table { font-size: .85rem; }\n\t\t.market-table td, .market-table th { padding: .25rem .15rem; }\n\t\t.odds-btn { padding: .1rem .3rem; font-size: .75rem; }\n\t\t.bet-arrow { display: none; }\n\t}\n\t.odds-btn {\n\t\tfont-family: var(--bs-font-monospace);\n\t\tfont-size: .8rem;\n\t\tpadding: .1rem .45rem;\n\t\tborder: 1px solid #cfd4da;\n\t\tbackground: #fff;\n\t\tcolor: #212529;\n\t\twhite-space: nowrap;\n\t}\n\t.odds-btn:hover { border-color: #0d6efd; color: #0d6efd; }\n\t.odds-btn.best { border-color: #198754; background: #e8f5ee; color: #146c43; font-weight: 600; }\n\t.odds-btn.disabled { opacity: .75; }\n\t.bet-arrow { font-size: .65rem; opacity: .6; }\n</style>\n<div class=\"p-2\">\n\t<label for=\"prop-select\">Choose a prop</label>\n\t<select bind:value={selected_prop} on:change={()=>{setPropMetrics()}} class=\"form-select form-select-lg\" id=\"prop-select\">\n\t\t{#each props as prop}\n\t\t<option value=\"{prop}\">{prop}</option>\n\t\t{/each}\n\t</select>\n\t\n\t\n\t<div class=\"mt-2 d-flex justify-content-center align-items-center\">\n\t\t<input style=\"width:95px;\" class=\"form-control form-control-lg d-inline-block\" min=\"{min_value}\" max=\"{max_value}\" step=\".5\" type=number bind:value={value_to_beat} on:input={()=>{probability = my_dist.cdf(value_to_beat)}}> <h6 class=\"lead ps-1 my-0\">{selected_prop}</h6>\n\t</div>\n\t<div class=\"text-center text-muted small\">\n\t\t{#if using_curve}\n\t\t\tBased on {fair_odds[selected_prop].n} past games projected like this one\n\t\t{:else}\n\t\t\tBased on a normal curve around the projection\n\t\t{/if}\n\t</div>\n\t{#if premium_membership && market.lines}\n\t<div class=\"mx-auto mt-2\" style=\"max-width: 560px;\">\n\t\t<div class=\"d-flex justify-content-between align-items-baseline px-1 small text-muted\">\n\t\t\t<span>\n\t\t\t\t{#if market.exact}\n\t\t\t\t\tBooks posting <strong>{value_to_beat}+ {selected_prop}</strong>, best value first\n\t\t\t\t{:else}\n\t\t\t\t\tNo book posts {value_to_beat}+ {selected_prop}; the nearest line is\n\t\t\t\t{/if}\n\t\t\t</span>\n\t\t\t<span class=\"d-none d-sm-inline\">EV = model vs the book's price</span>\n\t\t</div>\n\t\t<table class=\"table table-sm mb-0 align-middle market-table\">\n\t\t\t<thead><tr class=\"text-muted small\"><th>Book</th><th class=\"text-center\">Line</th><th class=\"text-center\">Over</th><th class=\"text-center\">Under</th><th class=\"text-end\">Best side</th></tr></thead>\n\t\t\t<tbody>\n\t\t\t\t{#each market.rows as r}\n\t\t\t\t<tr>\n\t\t\t\t\t<td class=\"fw-semibold book-name\">{r.book}</td>\n\t\t\t\t\t<td class=\"text-center\">{r.line}</td>\n\t\t\t\t\t<td class=\"text-center\">\n\t\t\t\t\t\t{#if r.over !== null}\n\t\t\t\t\t\t\t{#if r.over_link}\n\t\t\t\t\t\t\t\t<a class=\"btn btn-sm odds-btn\" class:best={r.top_over} href={r.over_link} target=\"_blank\" rel=\"noopener\" title=\"Bet Over {r.line} at {r.book}\">{fmtOdds(r.over)} <span class=\"bet-arrow\">&#8599;</span></a>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<span class=\"btn btn-sm odds-btn disabled\" class:best={r.top_over}>{fmtOdds(r.over)}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{:else}<span class=\"text-muted\">&mdash;</span>{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"text-center\">\n\t\t\t\t\t\t{#if r.under !== null}\n\t\t\t\t\t\t\t{#if r.under_link}\n\t\t\t\t\t\t\t\t<a class=\"btn btn-sm odds-btn\" class:best={r.top_under} href={r.under_link} target=\"_blank\" rel=\"noopener\" title=\"Bet Under {r.line} at {r.book}\">{fmtOdds(r.under)} <span class=\"bet-arrow\">&#8599;</span></a>\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<span class=\"btn btn-sm odds-btn disabled\" class:best={r.top_under}>{fmtOdds(r.under)}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{:else}<span class=\"text-muted\">&mdash;</span>{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"text-end small text-nowrap\">\n\t\t\t\t\t\t<span class=\"fw-semibold\" class:text-success={r.best > 0} class:text-danger={r.best <= 0}>{r.pick} {fmtEv(r.best)}</span>\n\t\t\t\t\t\t<div class=\"text-muted\" style=\"font-size: .7rem;\">model {(r.model_p * 100).toFixed(0)}%{#if r.book_p !== null} &middot; book {(r.book_p * 100).toFixed(0)}%{/if} over</div>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t{/each}\n\t\t\t</tbody>\n\t\t</table>\n\t\t<div class=\"text-muted px-1\" style=\"font-size: .7rem;\">Tap a price to open that bet at the book. Prices are from the last scan and can move; Polymarket US has no bet links.</div>\n\t</div>\n\t{/if}\n\t<div class=\"px-5\" style=\"max-height: 275px;\">\n\t\t<OverUnderChart league={league} selected_prop={selected_prop} line_value={value_to_beat} chart_data={gamelog}/>\n\t</div>\n\t<div class=\"my-1 mx-4\">\n\t\t<input class=\"form-range\" min=\"{min_value}\" max=\"{max_value}\" step=\".5\" type=range bind:value={value_to_beat} on:input={()=>{probability = my_dist.cdf(value_to_beat)}}>\n\t</div>\n\t<div class=\"row mt-2\">\n\t\t{#if !premium_membership}\n\t\t<PremiumOnly title_text={\"GigaStuds Only!\"} text={\"Prop Bet Probabilities only available for GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"} logo_url={window.logo_url}/>\n\t\t{:else}\n\t\t<div class=\"text-center col-6\">\n\t\t\t<div class=\"d-flex flex-column\">\n\t\t\t\t<h4>Under</h4>\n\t\t\t\t<h4 class=\"lead\">Probability: {(probability).toFixed(2)}</h4>\n\t\t\t\t<h4 class=\"lead\">Moneyline: {probabilityToMoneyLine(probability)}</h4>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"text-center col-6\">\n\t\t\t<div class=\"d-flex flex-column\">\n\t\t\t\t<h4>Over</h4>\n\t\t\t\t<h4 class=\"lead\">Probability: {(1-probability).toFixed(2)}</h4>\n\t\t\t\t<h4 class=\"lead\">Moneyline: {probabilityToMoneyLine(1-probability)}</h4>\n\t\t\t</div>\n\t\t</div>\n\t\t{/if}\n\t</div>\n</div>\n","<script>\n    export let gamelog = [];\n    export let league = \"nba\";\n    export let is_pitcher = false;\n    export let is_qb = false;\n    export let is_goalie = false;\n</script>\n<div class=\"p-2\">\n    <h2>GameLog</h2>\n    <div class=\"card\" style=\"max-height: 500px; overflow-y:auto; overflow-x:hidden;\">\n        {#each gamelog as entry, index}\n        <div class=\"p-1 border-bottom\">\n            <div class=\"lead text-center\">\n            <span><span class=\"fw-normal\">{entry[\"fantasy points\"].toFixed(1)}</span> FP </span>\n            {#if entry.player_game.team.id == entry.player_game.game.home_team.id}\n                <span class=\"text-muted\">VS {entry.player_game.game.away_team.short_name}</span>\n            {:else}\n                <span class=\"text-muted\">@ {entry.player_game.game.home_team.short_name}</span>\n            {/if}\n                {new Date(entry.player_game.game.start_time.replace(/-/g, \"/\")).toLocaleDateString(\"default\",{month:'short', day:\"numeric\"})}\n            </div>\n            <div class=\"text-center\">\n                {#if league == \"nba\"}\n                <div class=\"row\">\n                    <div class=\"col-2 pb-1 fw-bold border-end\">M</div>\n                    <div class=\"col-2 fw-bold border-end\">P</div>\n                    <div class=\"col-2 fw-bold border-end\">R</div>\n                    <div class=\"col-2 fw-bold border-end\">A</div>\n                    <div class=\"col-2 fw-bold border-end\">B</div>\n                    <div class=\"col-2 fw-bold\">S</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.minutes)}</div>\n                    <div class=\"col-2 border-end\">{entry.points}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rebounds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.assists)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.blocks)}</div>\n                    <div class=\"col-2\">{parseInt(entry.steals)}</div>\n                </div>\n                {:else if league == \"mlb\" && is_pitcher}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">K</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">W</div>\n                    <div class=\"col-2 fw-bold border-end\">PT</div>\n                    <div class=\"col-2 fw-bold border-end\">H</div>\n                    <div class=\"col-2 fw-bold border-end\">BB</div>\n                    <div class=\"col-2 fw-bold\">ER</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{entry.strikeouts}</div>\n                    <div class=\"col-2 border-end\">{entry.wins}</div>\n                    <div class=\"col-2 border-end\">{entry.pitches_thrown}</div>\n                    <div class=\"col-2 border-end\">{entry.hits_allowed}</div>\n                    <div class=\"col-2 border-end\">{entry.walks_allowed}</div>\n                    <div class=\"col-2\">{entry.earned_runs}</div>\n                </div>\n                {:else if league == \"mlb\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Hits</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Runs</div>\n                    <div class=\"col-2 fw-bold border-end\">RBI</div>\n                    <div class=\"col-2 fw-bold border-end\">SB</div>\n                    <div class=\"col-2 fw-bold border-end\">BB</div>\n                    <div class=\"col-2 fw-bold\">K</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.singles)+parseInt(entry.doubles)+parseInt(entry.triples)+parseInt(entry.homeruns)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.runs)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rbis)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.stolen_bases)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.walks)}</div>\n                    <div class=\"col-2\">{parseInt(entry.batter_strikeouts)}</div>\n                </div>\n                {:else if league == \"nfl\" && is_qb}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Pass Yds</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Pass Tds</div>\n                    <div class=\"col-2 fw-bold\">Comp / Att</div>\n                    <div class=\"col-2 fw-bold border-end\">Int</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Yds</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Tds</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.pass_yards)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.pass_tds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.completions)} / {parseInt(entry.attempts)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.off_interceptions)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rush_yards)}</div>\n                    <div class=\"col-2\">{parseInt(entry.rush_tds)}</div>\n                </div>\n                {:else if league == \"nhl\" && is_goalie}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">SV</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">SA</div>\n                    <div class=\"col-2 fw-bold border-end\">GA</div>\n                    <div class=\"col-2 fw-bold border-end\">W</div>\n                    <div class=\"col-2 fw-bold border-end\">SO</div>\n                    <div class=\"col-2 fw-bold\">TOI</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.saves)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shots_against)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.goals_against)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.wins)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shutouts)}</div>\n                    <div class=\"col-2\">{parseFloat(entry.time_on_ice).toFixed(0)}</div>\n                </div>\n                {:else if league == \"nhl\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">G</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">A</div>\n                    <div class=\"col-2 fw-bold border-end\">SOG</div>\n                    <div class=\"col-2 fw-bold border-end\">BLK</div>\n                    <div class=\"col-2 fw-bold border-end\">PPP</div>\n                    <div class=\"col-2 fw-bold\">TOI</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.goals)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.assists)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shots)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.blocked_shots)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.power_play_goals) + parseInt(entry.power_play_assists)}</div>\n                    <div class=\"col-2\">{parseFloat(entry.time_on_ice).toFixed(1)}</div>\n                </div>\n                {:else if league == \"nfl\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Rec Yds</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Rec Tds</div>\n                    <div class=\"col-2 fw-bold\">Receptions</div>\n                    <div class=\"col-2 fw-bold border-end\">Targets</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Yds</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Tds</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.rec_yards)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rec_tds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.receptions)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.targets)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rush_yards)}</div>\n                    <div class=\"col-2\">{parseInt(entry.rush_tds)}</div>\n                </div>\n                {/if}\n            </div>\n        </div>\n        {/each}\n    </div>\n</div>","<script>\n    export let averages = false;\n    export let league = \"nba\";\n    export let is_goalie = false;\n    import { afterUpdate } from 'svelte';\n    function roundToTenth(number) {\n        //check if number is a number\n        if (isNaN(number)) {\n            return \"\";\n        }\n        return number.toFixed(1);\n    }\n    function destroyTooltips() {\n        var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n        var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\n            return new bootstrap.Tooltip(tooltipTriggerEl).dispose();\n        })\n    }\n    function enableTooltips() {\n        //run after .5 seconds\n        var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n        var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\n            return new bootstrap.Tooltip(tooltipTriggerEl)\n        })\n    }\n    function reInitTooltips() {\n        destroyTooltips();\n        enableTooltips();\n    }\n    afterUpdate(() => {\n\t\treInitTooltips();\n\t});\n</script>\n<h4 class=\"m-0\">Season Stats\n    {#if averages}\n    <small class=\"text-muted\"> - {roundToTenth(averages['fantasy points'])} FP</small>\n    {/if}\n</h4>\n<div class=\"border rounded-2 w-100 row mx-0 my-1\">\n    {#if league == \"nba\"}\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" data-bs-html=\"true\" title=\"\n    <div>FG {roundToTenth(parseInt(averages['two_point_fgm'])+parseInt(averages['three_point_fgm']))} / {roundToTenth(parseInt(averages['two_point_fga'])+parseInt(averages['three_point_fga']))}</div>\n    <div>3FG {roundToTenth(averages['three_point_fgm'])} / {roundToTenth(averages['three_point_fga'])}</div>\n    <div>FT {roundToTenth(averages['ftm'])} / {roundToTenth(averages['fta'])}</div>\">\n        <div class=\"fw-bold\">PTS</div>\n        <div>{roundToTenth(averages['points'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">REB</div>\n        <div>{roundToTenth(averages['rebounds'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">AST</div>\n        <div>{roundToTenth(averages['assists'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">STL</div>\n        <div>{roundToTenth(averages['steals'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">BLK</div>\n        <div>{roundToTenth(averages['blocks'])}</div>\n    </div>\n    <div class=\"col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">TO</div>\n        <div>{roundToTenth(averages['turnovers'])}</div>\n    </div>\n    {:else if league == \"nhl\" && is_goalie}\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">SV</div>\n        <div>{roundToTenth(averages['saves'])}</div>\n    </div>\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">GA</div>\n        <div>{roundToTenth(averages['goals_against'])}</div>\n    </div>\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">SV%</div>\n        <div>{averages['shots_against'] > 0 ? (averages['saves'] / averages['shots_against']).toFixed(3) : \"\"}</div>\n    </div>\n    <div class=\"col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">W%</div>\n        <div>{isNaN(averages['wins']) ? \"\" : Math.round(averages['wins'] * 100) + \"%\"}</div>\n    </div>\n    {:else if league == \"nhl\"}\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">G</div>\n        <div>{roundToTenth(averages['goals'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">A</div>\n        <div>{roundToTenth(averages['assists'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">PTS</div>\n        <div>{roundToTenth(averages['points'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">SOG</div>\n        <div>{roundToTenth(averages['shots on goal'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">BLK</div>\n        <div>{roundToTenth(averages['blocked shots'])}</div>\n    </div>\n    <div class=\"col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">TOI</div>\n        <div>{roundToTenth(averages['time_on_ice'])}</div>\n    </div>\n    {/if}\n</div>","<script>\n    import PropCalculator from './PropCalculator.svelte';\n    import Gamelog from './Gamelog.svelte';\n    import SeasonAvgTable from './SeasonAvgTable.svelte';\n    export let player;\n    export let proj_id;\n    export let league = \"nba\";\n    export let premium_membership = true;\n    export let placeholder_variances;\n    // TODO consider passing in the categories as a prop\n    let player_stats;\n    let variances;\n    let projections;\n    let player_id = player.id;\n    let props;\n    let prop_metrics;\n    let means = {};\n    // Empirical over/under curves from /<league>/fair_odds/<proj_id>/ (null\n    // when unavailable, in which case the calculator falls back to a normal curve)\n    let fair_odds = null;\n    let market_lines = null;\n    // NHL goalies and skaters project different stats\n    $: is_goalie = league == \"nhl\" && player.positions.includes(\"G\");\n    $: player_id = player.id;\n    $: refreshPlayer(player_id);\n    function refreshPlayer() {\n        let prom1 = getPlayerStats(player_id);\n        let prom2 = getProjection(proj_id);\n        let prom3 = getFairOdds(proj_id);\n        //wait till all promises are resolved - move this to child component\n        Promise.all([prom1, prom2, prom3]).then(values => {\n            prop_metrics = combineStats(projections, variances);\n        });  \n    }\n    function getFairOdds(proj_id) {\n        fair_odds = null;\n        return fetch(`/${league}/fair_odds/${proj_id}/`)\n            .then(response => response.ok ? response.json() : null)\n            .then(data => {\n                fair_odds = data && data.stats ? data.stats : null;\n                market_lines = data && data.market ? data.market : null;\n            })\n            .catch(() => { fair_odds = null; market_lines = null; });\n    }\n    function combineStats(projections, variances) {\n        let combined = [];\n        props = [];\n        for (let stat in projections) {\n            let obj = {};\n            if (league == \"mlb\" && ['singles', 'doubles', 'triples', 'homeruns', 'walks'].includes(stat)) {\n                continue;\n            }\n            if (league == \"nfl\" && ['off interceptions'].includes(stat)) {\n                continue;\n            }\n            if (league == \"nhl\" && ['shots', 'power play goals', 'power play assists'].includes(stat)) {\n                continue;\n            }\n            props.push(stat);\n            obj.name = stat;\n            obj.projection = projections[stat];\n            // turn variance to standard deviation\n            obj.variance = variances[stat];\n            if(!obj.variance){\n                let stat_name_underscore = stat.replace(/ /g, \"_\");\n                obj.variance = variances[stat_name_underscore];\n            }\n            obj.sd = Math.sqrt(obj.variance);\n            combined.push(obj);\n        }\n        // Open on the stat the position is bet on: passing for QBs, rushing\n        // for RBs, receiving for everyone who catches the ball\n        let first = defaultProp(props);\n        if (first) {\n            props = [first, ...props.filter(p => p !== first)];\n        }\n        return combined;\n    }\n    function defaultProp(available) {\n        let wanted = [];\n        if (league == \"nfl\") {\n            let pos = player.positions || \"\";\n            if (pos.includes(\"QB\")) wanted = [\"pass yards\"];\n            else if (pos.includes(\"RB\")) wanted = [\"rush yards\"];\n            else wanted = [\"rec yards\"];\n        } else if (league == \"nba\") {\n            wanted = [\"points\"];\n        } else if (league == \"nhl\") {\n            wanted = is_goalie ? [\"saves\"] : [\"shots on goal\", \"points\"];\n        } else if (league == \"mlb\") {\n            wanted = player.positions.includes(\"P\") ? [\"strikeouts\"] : [\"hits\", \"total bases\"];\n        }\n        return wanted.find(w => available.includes(w)) || null;\n    }\n    function getPlayerStats(player_id){\n        return fetch(`/${league}/stats/${player_id}/`)\n        .then(response => response.json())\n        .then(data => {\n                //iterate over data\n                player_stats = [];\n                for(var stats of data){\n                    //append fields to player_stats TODO add points here\n                    if(league == \"nba\"){\n                        stats.fields.points = parseInt(stats.fields.ftm) + parseInt(stats.fields.two_point_fgm) * 2 + parseInt(stats.fields.three_point_fgm) * 3;\n                        stats.fields[\"fantasy points\"] = stats.fields.points + parseInt(stats.fields.rebounds) * 1.2 + parseInt(stats.fields.assists) * 1.5 + parseInt(stats.fields.steals) * 3 + parseInt(stats.fields.blocks) * 3 - parseInt(stats.fields.turnovers);\n                    }\n                    else if (league == \"mlb\"){\n                        if (player.positions.includes(\"P\")){\n                            // calculate fantasy points for pitchers\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.earned_runs) * -3 + parseInt(stats.fields.innings_pitched) * 3 + parseInt(stats.fields.quality_starts) * 4 + parseInt(stats.fields.strikeouts) * 3 + parseInt(stats.fields.wins) * 6;\n                        }\n                        else{\n                            // calculate fantasy points for batters\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.singles) * 3 + parseInt(stats.fields.doubles) * 6 + parseInt(stats.fields.triples) * 9 + parseInt(stats.fields.homeruns) * 12 + parseInt(stats.fields.walks) * 3 + parseInt(stats.fields.runs) * 3.2 + parseInt(stats.fields.stolen_bases) * 6 + parseInt(stats.fields.rbis) * 3.5;\n                        }\n                    }\n                    else if(league == \"nhl\"){\n                        if (is_goalie){\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.wins) * 12 + parseInt(stats.fields.saves) * 0.8 - parseInt(stats.fields.goals_against) * 4 + parseInt(stats.fields.shutouts) * 8;\n                        }\n                        else{\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.goals) * 12 + parseInt(stats.fields.assists) * 8 + (parseInt(stats.fields.shots) + parseInt(stats.fields.blocked_shots)) * 1.6 + (parseInt(stats.fields.power_play_goals) + parseInt(stats.fields.power_play_assists)) * 0.5;\n                        }\n                    }\n                    else if(league == \"nfl\"){\n                        stats.fields[\"fantasy points\"] = parseInt(stats.fields.pass_yards) * 0.04 + parseInt(stats.fields.pass_tds) * 4 + parseInt(stats.fields.off_interceptions) * -2 + parseInt(stats.fields.rush_yards) * 0.1 + parseInt(stats.fields.rush_tds) * 6 + parseInt(stats.fields.rec_yards) * 0.1 + parseInt(stats.fields.rec_tds) * 6 + parseInt(stats.fields.fumbles_lost) * -2 * parseInt(stats.fields.rush_2pc) * 2 + parseInt(stats.fields.rec_2pc) * 2 + parseInt(stats.fields.receptions) * .5;\n                    }\n                    player_stats.push(stats.fields);\n                }\n                buildPropCalcMetrics();\n            }\n        );\n    }\n    function getProjection(proj_id){\n        return fetch(`/${league}/projections/${proj_id}/`)\n        .then(response => response.json())\n        .then(data => {\n                //create cats\n                let cats = {};\n                let sport_cats = [];\n                if (league == \"nba\"){\n                    sport_cats = [\"points\", \"rebounds\", \"assists\", \"steals\", \"blocks\", \"turnovers\", \"fantasy points\"];\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        sport_cats = [\"strikeouts\", \"fantasy points\", \"walks allowed\", \"earned runs\", \"innings pitched\"];\n                    }\n                    else{\n                        sport_cats = [\"rbis\", \"singles\", \"doubles\", \"triples\", \"homeruns\", \"walks\", \"runs\", \"fantasy points\"];\n                    }\n                }\n                else if (league == \"nfl\"){\n                    if (player.positions.includes('QB')){\n                        sport_cats = [ \"pass yards\", \"pass tds\", \"rush yards\", \"rush tds\", \"fantasy points\", \"off interceptions\", \"attempts\", \"completions\"];\n                    }\n                    else{\n                        sport_cats = [\"rush yards\", \"rush tds\", \"rec yards\", \"rec tds\", \"receptions\", \"fantasy points\", \"carries\", \"targets\"];\n                    }\n                    \n                }\n                else if (league == \"nhl\"){\n                    if (is_goalie){\n                        sport_cats = [\"saves\", \"shots against\", \"goals against\", \"fantasy points\"];\n                    }\n                    else{\n                        sport_cats = [\"goals\", \"assists\", \"points\", \"shots\", \"blocked shots\", \"power play goals\", \"power play assists\", \"fantasy points\"];\n                    }\n                }\n                for (var cat in data[0].fields){\n                    let cat_no_underscore = cat.replace(/_/g, \" \");\n                    if(cat == \"fanduel_proj\"){\n                        cats[\"fantasy points\"] = data[0].fields[cat];\n                    }\n                    else if (sport_cats.includes(cat_no_underscore)){\n                        cats[cat_no_underscore] = data[0].fields[cat];\n                    }\n                }\n                projections = cats;\n                //add aggragate stats\n                if (league == \"nba\"){\n                    projections[\"steals+blocks\"] = parseFloat(projections.steals) + parseFloat(projections.blocks);\n                    projections[\"points+reb+ast\"] = parseFloat(projections.points) + parseFloat(projections.rebounds) + parseFloat(projections.assists);\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        \n                    }\n                    else{\n                        //hack total bases to give a better estimate for bets even though it's no longer accurate\n                        projections[\"total bases\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) * 2 + parseFloat(projections.triples) * 2  + parseFloat(projections.homeruns) * 2;\n                        projections[\"runs+rbis\"] = parseFloat(projections.runs) + parseFloat(projections.rbis);\n                        projections[\"hits+walks\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) + parseFloat(projections.triples) + parseFloat(projections.homeruns) + parseFloat(projections.walks);\n                        projections[\"hits\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) + parseFloat(projections.triples) + parseFloat(projections.homeruns);\n                    }\n                }\n                else if (league == \"nhl\" && !is_goalie){\n                    projections[\"shots on goal\"] = parseFloat(projections.shots);\n                    projections[\"power play points\"] = parseFloat(projections[\"power play goals\"]) + parseFloat(projections[\"power play assists\"]);\n                    if (!parseFloat(projections.points)){\n                        projections[\"points\"] = parseFloat(projections.goals) + parseFloat(projections.assists);\n                    }\n                }\n                else if (league == \"nfl\"){\n                    if (player.positions.includes('QB')){\n                        projections[\"total yards\"] = parseFloat(projections[\"pass yards\"]) + parseFloat(projections[\"rush yards\"]);\n                        projections[\"total tds\"] = parseFloat(projections[\"pass tds\"]) + parseFloat(projections[\"rush tds\"]);\n                        projections[\"interceptions\"] = parseFloat(projections[\"off interceptions\"]);\n                    }\n                    else{\n                        projections[\"total yards\"] = parseFloat(projections[\"rush yards\"]) + parseFloat(projections[\"rec yards\"]);\n                        projections[\"total tds\"] = parseFloat(projections[\"rush tds\"]) + parseFloat(projections[\"rec tds\"]);\n                    }\n                }\n            }\n        );\n    }\n    function buildPropCalcMetrics() {\n        let totals = {};\n        means = {};\n        //check that player_stats has at least 5 entries\n        if (player_stats.length < 5){\n            //use the placeholder variances instead\n            let vars = placeholder_variances;\n            let formatted_vars = {};\n            for (let stat in vars){\n                if(player.positions.includes('P') && league == \"mlb\" && stat == \"pitching_fantasy_points\"){\n                    formatted_vars[\"fantasy points\"] = vars[stat];\n                }\n                else if(league == \"nhl\" && stat == \"goalie_fantasy_points\"){\n                    if (is_goalie){\n                        formatted_vars[\"fantasy points\"] = vars[stat];\n                    }\n                }\n                else if(league == \"nhl\" && is_goalie && stat == \"fantasy_points\"){\n                    // the skater total; the goalie one is set above\n                }\n                else{\n                    let formatted_stat_key = stat.replace(/_plus_/g, \"+\");\n                    formatted_stat_key = formatted_stat_key.replace(/_/g, \" \");\n                    formatted_vars[formatted_stat_key] = vars[stat];\n                }\n            }\n            variances = formatted_vars;\n        }\n        else{\n            //calculate the variances for the stats\n            for(var gamelog of player_stats){\n                for(var stat in gamelog){\n                    //if totals[stat] is undefined, set it to 0\n                    if(totals[stat] === undefined){\n                        totals[stat] = 0;\n                    }\n                    totals[stat] += parseFloat(gamelog[stat]);\n                }\n            }\n            for(var stat in totals){\n                means[stat] = totals[stat] / player_stats.length;\n            }\n            if (league == \"nba\"){\n                means[\"steals+blocks\"] = parseFloat(means.steals) + parseFloat(means.blocks);\n                means[\"points+reb+ast\"] = parseFloat(means.points) + parseFloat(means.rebounds) + parseFloat(means.assists);\n            }\n            else if (league == \"mlb\"){\n                if(player.positions.includes('P')){\n                    \n                }\n                else{\n                    means[\"total bases\"] = parseFloat(means.singles) + parseFloat(means.doubles) * 2 + parseFloat(means.triples) * 3  + parseFloat(means.homeruns) * 4;\n                    means[\"runs+rbis\"] = parseFloat(means.runs) + parseFloat(means.rbis);\n                    means[\"hits\"] = parseFloat(means.singles) + parseFloat(means.doubles) + parseFloat(means.triples) + parseFloat(means.homeruns);\n                    means[\"hits+walks\"] = parseFloat(means.singles) + parseFloat(means.doubles) + parseFloat(means.triples) + parseFloat(means.homeruns) + parseFloat(means.walks);\n\n                }\n            }\n            else if (league == \"nhl\"){\n                means[\"points\"] = parseFloat(means.goals) + parseFloat(means.assists);\n                means[\"shots on goal\"] = parseFloat(means.shots);\n                means[\"blocked shots\"] = parseFloat(means.blocked_shots);\n                means[\"power play points\"] = parseFloat(means.power_play_goals) + parseFloat(means.power_play_assists);\n                means[\"shots against\"] = parseFloat(means.shots_against);\n                means[\"goals against\"] = parseFloat(means.goals_against);\n            }\n            else if (league == \"nfl\"){\n                means[\"interceptions\"] = parseFloat(means[\"off_interceptions\"]);\n                means[\"total_yards\"] = parseFloat(means.pass_yards) + parseFloat(means.rush_yards) + parseFloat(means.rec_yards);\n                means[\"total_tds\"] = parseFloat(means.pass_tds) + parseFloat(means.rush_tds) + parseFloat(means.rec_tds);\n            }\n            //for each number: subtract the Mean and square the result then get the mean of this\n            variances = {};\n            if (league == \"nba\"){\n                variances[\"points\"] = 0;\n                variances[\"rebounds\"] = 0;\n                variances[\"assists\"] = 0;\n                variances[\"steals\"] = 0;\n                variances[\"blocks\"] = 0;\n                variances[\"steals+blocks\"] = 0;\n                variances[\"points+reb+ast\"] = 0;\n                variances[\"fantasy points\"] = 0;\n            }\n            else if (league == \"mlb\"){\n                variances[\"fantasy points\"] = 0;\n                if(player.positions.includes('P')){\n                    variances[\"strikeouts\"] = 0;\n                    variances[\"earned_runs\"] = 0;\n                    variances[\"innings_pitched\"] = 0;\n                    variances[\"walks_allowed\"] = 0;\n                }\n                else{\n                    variances[\"rbis\"] = 0;\n                    variances[\"runs\"] = 0;\n                    variances[\"runs+rbis\"] = 0;\n                    variances[\"total bases\"] = 0;\n                    variances[\"hits\"] = 0;\n                    variances[\"hits+walks\"] = 0;\n                }\n            }\n            else if (league == \"nhl\"){\n                variances[\"fantasy points\"] = 0;\n                if (is_goalie){\n                    variances[\"saves\"] = 0;\n                    variances[\"shots against\"] = 0;\n                    variances[\"goals against\"] = 0;\n                }\n                else{\n                    variances[\"goals\"] = 0;\n                    variances[\"assists\"] = 0;\n                    variances[\"points\"] = 0;\n                    variances[\"shots on goal\"] = 0;\n                    variances[\"blocked shots\"] = 0;\n                    variances[\"power play points\"] = 0;\n                }\n            }\n            else if (league == \"nfl\"){\n                variances[\"fantasy points\"] = 0;\n                variances[\"pass_yards\"] = 0;\n                variances[\"rush_yards\"] = 0;\n                variances[\"rec_yards\"] = 0;\n                variances[\"total_yards\"] = 0;\n                variances[\"total_tds\"] = 0;\n                variances[\"receptions\"] = 0;\n                variances[\"pass_tds\"] = 0;\n                variances[\"rush_tds\"] = 0;\n                variances[\"rec_tds\"] = 0;\n                variances[\"interceptions\"] = 0;\n                variances[\"attempts\"] = 0;\n                variances[\"completions\"] = 0;\n                variances[\"carries\"] = 0;\n                variances[\"targets\"] = 0;\n            }\n            for(var gamelog of player_stats){\n                variances[\"fantasy points\"] += Math.pow(parseFloat(gamelog[\"fantasy points\"]) - means[\"fantasy points\"], 2);\n                if (league == \"nba\"){\n                    variances[\"points\"] += Math.pow(parseFloat(gamelog[\"points\"]) - means[\"points\"], 2);\n                    variances[\"rebounds\"] += Math.pow(parseFloat(gamelog[\"rebounds\"]) - means[\"rebounds\"], 2);\n                    variances[\"assists\"] += Math.pow(parseFloat(gamelog[\"assists\"]) - means[\"assists\"], 2);\n                    variances[\"steals\"] += Math.pow(parseFloat(gamelog[\"steals\"]) - means[\"steals\"], 2);\n                    variances[\"blocks\"] += Math.pow(parseFloat(gamelog[\"blocks\"]) - means[\"blocks\"], 2);\n                    variances[\"points+reb+ast\"] += Math.pow(parseFloat(gamelog[\"points\"]) + parseFloat(gamelog[\"rebounds\"]) + parseFloat(gamelog[\"assists\"]) - parseFloat(means[\"points+reb+ast\"]), 2);\n                    variances[\"steals+blocks\"] += Math.pow(parseFloat(gamelog[\"steals\"]) + parseFloat(gamelog[\"blocks\"]) - parseFloat(means[\"steals+blocks\"]), 2);\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        variances[\"strikeouts\"] += Math.pow(parseFloat(gamelog[\"strikeouts\"]) - means[\"strikeouts\"], 2);\n                        variances[\"earned_runs\"] += Math.pow(parseFloat(gamelog[\"earned_runs\"]) - means[\"earned_runs\"], 2);\n                        variances[\"innings_pitched\"] += Math.pow(parseFloat(gamelog[\"innings_pitched\"]) - means[\"innings_pitched\"], 2);\n                        variances[\"walks_allowed\"] += Math.pow(parseFloat(gamelog[\"walks_allowed\"]) - means[\"walks_allowed\"], 2);\n                    }\n                    else{\n                        variances[\"rbis\"] += Math.pow(parseFloat(gamelog[\"rbis\"]) - means[\"rbis\"], 2);\n                        variances[\"runs\"] += Math.pow(parseFloat(gamelog[\"runs\"]) - means[\"runs\"], 2);\n                        variances[\"runs+rbis\"] += Math.pow(parseFloat(gamelog[\"runs\"]) + parseFloat(gamelog[\"rbis\"]) - parseFloat(means[\"runs+rbis\"]), 2);\n                        variances[\"total bases\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) * 2 + parseFloat(gamelog.triples) * 3  + parseFloat(gamelog.homeruns) * 4 - parseFloat(means[\"total bases\"]), 2);\n                        variances[\"hits\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) + parseFloat(gamelog.triples) + parseFloat(gamelog.homeruns) - parseFloat(means[\"hits\"]), 2);\n                        variances[\"hits+walks\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) + parseFloat(gamelog.triples) + parseFloat(gamelog.homeruns) + parseFloat(gamelog.walks) - parseFloat(means[\"hits+walks\"]), 2);\n                    }\n                }\n                else if(league == \"nhl\"){\n                    if (is_goalie){\n                        variances[\"saves\"] += Math.pow(parseFloat(gamelog[\"saves\"]) - means[\"saves\"], 2);\n                        variances[\"shots against\"] += Math.pow(parseFloat(gamelog[\"shots_against\"]) - means[\"shots against\"], 2);\n                        variances[\"goals against\"] += Math.pow(parseFloat(gamelog[\"goals_against\"]) - means[\"goals against\"], 2);\n                    }\n                    else{\n                        variances[\"goals\"] += Math.pow(parseFloat(gamelog[\"goals\"]) - means[\"goals\"], 2);\n                        variances[\"assists\"] += Math.pow(parseFloat(gamelog[\"assists\"]) - means[\"assists\"], 2);\n                        variances[\"points\"] += Math.pow(parseFloat(gamelog[\"goals\"]) + parseFloat(gamelog[\"assists\"]) - means[\"points\"], 2);\n                        variances[\"shots on goal\"] += Math.pow(parseFloat(gamelog[\"shots\"]) - means[\"shots on goal\"], 2);\n                        variances[\"blocked shots\"] += Math.pow(parseFloat(gamelog[\"blocked_shots\"]) - means[\"blocked shots\"], 2);\n                        variances[\"power play points\"] += Math.pow(parseFloat(gamelog[\"power_play_goals\"]) + parseFloat(gamelog[\"power_play_assists\"]) - means[\"power play points\"], 2);\n                    }\n                }\n                else if(league == \"nfl\"){\n                    variances[\"pass_yards\"] += Math.pow(parseFloat(gamelog[\"pass_yards\"]) - means[\"pass_yards\"], 2);\n                    variances[\"rush_yards\"] += Math.pow(parseFloat(gamelog[\"rush_yards\"]) - means[\"rush_yards\"], 2);\n                    variances[\"rec_yards\"] += Math.pow(parseFloat(gamelog[\"rec_yards\"]) - means[\"rec_yards\"], 2);\n                    variances[\"total_yards\"] += Math.pow(parseFloat(gamelog[\"pass_yards\"]) + parseFloat(gamelog[\"rush_yards\"]) + parseFloat(gamelog[\"rec_yards\"]) - parseFloat(means[\"total_yards\"]), 2);\n                    variances[\"total_tds\"] += Math.pow(parseFloat(gamelog[\"pass_tds\"]) + parseFloat(gamelog[\"rush_tds\"]) + parseFloat(gamelog[\"rec_tds\"]) - parseFloat(means[\"total_tds\"]), 2);\n                    variances[\"interceptions\"] += Math.pow(parseFloat(gamelog[\"off_interceptions\"]) - means[\"interceptions\"], 2);\n                    variances[\"receptions\"] += Math.pow(parseFloat(gamelog[\"receptions\"]) - means[\"receptions\"], 2);\n                    variances[\"pass_tds\"] += Math.pow(parseFloat(gamelog[\"pass_tds\"]) - means[\"pass_tds\"], 2);\n                    variances[\"rush_tds\"] += Math.pow(parseFloat(gamelog[\"rush_tds\"]) - means[\"rush_tds\"], 2);\n                    variances[\"rec_tds\"] += Math.pow(parseFloat(gamelog[\"rec_tds\"]) - means[\"rec_tds\"], 2);\n                    variances[\"attempts\"] += Math.pow(parseFloat(gamelog[\"attempts\"]) - parseFloat(means[\"attempts\"]), 2);\n                    variances[\"completions\"] += Math.pow(parseFloat(gamelog[\"completions\"]) - means[\"completions\"], 2);\n                    variances[\"carries\"] += Math.pow(parseFloat(gamelog[\"carries\"]) - means[\"carries\"], 2);\n                    variances[\"targets\"] += Math.pow(parseFloat(gamelog[\"targets\"]) - means[\"targets\"], 2);\n                }\n            }\n            for(var stat in variances){\n                variances[stat] = variances[stat] / player_stats.length;\n                //make sure the variance is not 0\n                if(variances[stat] == 0){\n                    variances[stat] = 0.25;\n                }\n            }\n        }\n    }\n</script>\n<style>\n    .consistent-height .tab-content {\n        display: flex;\n    }\n\n    .consistent-height .tab-content > .tab-pane {\n        display: block; /* undo \"display: none;\" */\n        visibility: hidden;\n        margin-right: -100%;\n        width: 100%;\n    }\n\n    .consistent-height .tab-content > .active {\n        visibility: visible;\n    }\n</style>\n<div>\n    <div id=\"player-info-holder\">\n        <div class=\"d-flex px-2 pt-2 flex-md-row border-bottom\">\n            <div class=\"col-6 align-self-end\">\n                <div class=\"d-none d-lg-block\" id=\"team-bg\" style=\"height: 0px; position:relative; z-index:0; max-height:200px;\">\n                    {#if league == \"mlb\"}\n                    <img style=\"position:absolute; aspect-ratio:1/1; opacity:.4; z-index:0; height:205px;\" alt=\"{player.team.short_name}\" id=\"team-photo\" src=\"{player.team_img}\" class=\"d-block mx-md-auto img-fluid\" loading=\"lazy\">\n                    {:else}\n                    <img style=\"position:absolute; top:-40px; opacity:.4; z-index:0; height:295px;\" alt=\"{player.team.short_name}\" id=\"team-photo\" src=\"{player.team_img}\" class=\"d-block mx-md-auto img-fluid\" loading=\"lazy\">\n                    {/if}\n                </div>\n                <div id=\"player-photo-holder\"  style=\"max-height: 200px; z-index:1; position:relative;\">\n                    <img style=\"max-height: 200px;\" id=\"player-photo\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\" src=\"{player.img}\" class=\"d-block mx-md-auto img-fluid\" alt=\"{player.name}\" loading=\"lazy\">\n                </div>\n            </div>\n            <div class=\"col-6 align-self-center\">\n                <h1 class=\"display-5 fw-bold lh-1 mb-1\" style=\"overflow-x:clip;\">{player.name}</h1>\n                <SeasonAvgTable league={league} averages={means} is_goalie={is_goalie}/>\n            </div>\n        </div>\n    </div>\n    <div class=\"consistent-height bg-white\" style=\"position: relative; z-index:1;\">\n        <ul class=\"nav nav-tabs\" id=\"myTab\" role=\"tablist\">\n            <li class=\"nav-item\" role=\"presentation\">\n            <button class=\"nav-link active\" id=\"prop-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#prop\" type=\"button\" role=\"tab\" aria-controls=\"home\" aria-selected=\"true\">Props &amp; Line Shop</button>\n            </li>\n            <li class=\"nav-item\" role=\"presentation\">\n            <button class=\"nav-link\" id=\"gamelog-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#gamelog\" type=\"button\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\">Gamelog</button>\n            </li>\n        </ul>\n        <div class=\"tab-content\">\n            <div class=\"tab-pane fade show active\" id=\"prop\" role=\"tabpanel\" aria-labelledby=\"prop-tab\">\n                <div id=\"prop-calc-holder\" class=\"bg-white\" style=\"position: relative; z-index:1;\">\n                    {#if prop_metrics}\n                        <PropCalculator premium_membership={premium_membership} league={league} stats={prop_metrics} props={props} fair_odds={fair_odds} market_lines={market_lines} gamelog={player_stats.slice(0, Math.min(player_stats.length, 5))}/>\n                    {/if}\n                </div>\n            </div>\n            <div class=\"tab-pane fade\" id=\"gamelog\" role=\"tabpanel\" aria-labelledby=\"gamelog-tab\">\n                <div id=\"game-log-holder\" class=\"bg-white\" style=\"position: relative; z-index:1;\">\n                    {#if player_stats}\n                        <Gamelog gamelog={player_stats} league={league} is_pitcher={player.positions.includes(\"P\")} is_qb={player.positions.includes(\"QB\")} is_goalie={is_goalie}/>\n                    {/if}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>","<script>\n    import PlayerSummary from './PlayerSummary.svelte';\n    export let player;\n    export let league = \"nba\";\n    export let proj_id;\n    export let premium_membership = true;\n    export let placeholder_variances;\n</script>\n<div class=\"modal fade\" id=\"player-modal\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n      <div class=\"modal-content\">\n        <div class=\"modal-body p-0\">\n            {#if player}\n            <PlayerSummary placeholder_variances={placeholder_variances} premium_membership={premium_membership} player={player} league={league} proj_id={proj_id}></PlayerSummary>\n            {/if}\n        </div>\n        <div class=\"modal-footer\">\n\t\t\t<div class=\"btn-group\" role=\"group\">\n\t\t\t\t<button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n\t\t\t</div>\n        </div>\n      </div>\n    </div>\n</div>","<script>\n    // Import Swiper Svelte components\n    import { Navigation, Pagination, Scrollbar, A11y } from \"swiper\";\n    import { Swiper, SwiperSlide } from \"swiper/svelte/swiper-svelte.js\";\n    import {\n        searchFilter,\n        positionFilter,\n        getTeams,\n        filterByTeam,\n        gameStrings,\n    } from \"./filter_utils.js\";\n    import GameCard from \"./GameCard.svelte\";\n    import Lineup from \"./Lineup.svelte\";\n    import PlayerCard from \"./PlayerCard.svelte\";\n    import PlayerModal from \"./PlayerModal.svelte\";\n    import PremiumOnly from \"./PremiumOnly.svelte\";\n    import \"swiper/swiper-bundle.min.css\";\n    // swiper core styles\n    import \"swiper/swiper.min.css\";\n    import { onMount } from \"svelte\";\n    // modules styles\n    import \"swiper/modules/navigation/navigation.min.css\";\n    import \"swiper/modules/pagination/pagination.min.css\";\n    let pos_filter = \"all\";\n\n    let projFP = 0;\n    let strategy = \"projection\";\n    let strategy_impact = 1;\n    let exposure_strategy = \"none\";\n    let exposure_strategy_impact = 0.5;\n    let min_unique_players = 1;\n    var generated_lineups = [];\n    var lineups_summary = [];\n    // The entries file (DraftKings Edit Entries / FanDuel CSV Edit) loaded in\n    // the Entries File modal, what the server read from it, and the last late swap\n    var entries_file = null;\n    var entries_info = null;\n    var entries_busy = false;\n    var swap_result = null;\n    let playerSearchString = \"\";\n    let sortableCols = { name: 0, salary: 0, proj: 0, val: 0 };\n    export let players;\n    export let games;\n    export let salary;\n    export let slate_id;\n    export let upcoming_slates;\n    export let roster;\n    export let ruleset_name;\n    export let league;\n    export let position_filters = [\"PG\", \"SG\", \"SF\", \"PF\", \"C\"];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    // Correlation rules: a defense, pitcher or goalie scores by stopping the\n    // players it faces, so it is kept off lineups with its opponents' offense\n    const single_game_slate = /Single|Showdown/.test(ruleset_name);\n    const ANTI_STACK = {\n        nfl: { label: \"No defense against my offense\", why: \"A defense scores when the offense it faces doesn't, so the two cancel out in one lineup.\", stoppers: [\"DST\", \"D\", \"DEF\"], stopped: [\"QB\", \"RB\", \"WR\", \"TE\"] },\n        mlb: { label: \"No pitcher against my hitters\", why: \"A pitcher scores by getting the hitters he faces out.\", stoppers: [\"P\"], stopped: [\"C\", \"1B\", \"2B\", \"3B\", \"SS\", \"OF\"] },\n        nhl: { label: \"No goalie against my skaters\", why: \"A goalie scores by stopping the skaters he faces.\", stoppers: [\"G\"], stopped: [\"C\", \"W\", \"D\"] },\n    };\n    let anti_stack = !single_game_slate && league in ANTI_STACK;\n    let bring_back = false;\n    // a locked defense facing a locked opponent makes the anti-stack impossible\n    $: anti_stack_conflict = antiStackConflict(roster);\n    function antiStackConflict(current_roster) {\n        const rule = ANTI_STACK[league];\n        if (!rule) return null;\n        const locked = Object.values(current_roster).map((slot) => slot.player).filter(Boolean);\n        for (const stopper of locked) {\n            if (!stopper.positions.some((p) => rule.stoppers.includes(p))) continue;\n            const facing = locked.find((p) => p.team == stopper.opp && p.positions.some((x) => rule.stopped.includes(x)));\n            if (facing) return `${stopper.name} is locked against ${facing.name}`;\n        }\n        return null;\n    }\n    let num_lineups = \"3\";\n    if (!premium_membership){\n        num_lineups = \"1\";\n    }\n    let teamStacks = [];\n    let gameStacks = [];\n    let positionStacks = [];\n    let selectedTeam = \"all\";\n    let teams = getTeams(games);\n    let mobile = window.innerWidth < 768;\n    let startSalary = salary;\n    let dragged_player_index = null;\n    let players_rostered = 0;\n    let roster_size = Object.keys(roster).length;\n    let teamGameStrings = gameStrings(games);\n    let modal_projection_id;\n    let modal_player;\n    function showPremiumModal() {\n        let myModal = new bootstrap.Modal(\n            document.getElementById(\"premium-modal\")\n        );\n        myModal.show();\n    }\n    function showPlayerModal(player) {\n        modal_projection_id = player.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(\n            document.getElementById(\"player-modal\")\n        );\n        myModal.show();\n    }\n    onMount(() => {\n        sortByX(\"salary\");\n    });\n    function checkMobile() {\n        if (window.innerWidth < 768) {\n            mobile = true;\n        } else {\n            mobile = false;\n        }\n    }\n    window.onresize = checkMobile;\n    function sortByX(key, toggle = 1) {\n        if (key == \"val\") {\n            sortByValue(toggle);\n            return;\n        }\n        if (sortableCols[key] == 1) {\n            sortableCols[key] = -1 * toggle;\n        } else {\n            sortableCols[key] = 1 * toggle;\n        }\n        players.sort((a, b) =>\n            a[key] > b[key] ? -1 * sortableCols[key] : 1 * sortableCols[key]\n        );\n        players = players;\n        for (var prop in sortableCols) {\n            if (prop != key) {\n                sortableCols[prop] = 0;\n            }\n        }\n        sortableCols = sortableCols;\n    }\n    function showSlateSelect() {\n        //check if slate_id is in upcoming_slates\n        for (let i = 0; i < upcoming_slates.length; i++) {\n            if (upcoming_slates[i].slate_id == slate_id) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function sortByValue(toggle = 1) {\n        if (sortableCols[\"val\"] == 1) {\n            sortableCols[\"val\"] = -1 * toggle;\n        } else {\n            sortableCols[\"val\"] = 1 * toggle;\n        }\n        players.sort((a, b) =>\n            a.proj / a.salary > b.proj / b.salary\n                ? -1 * sortableCols[\"val\"]\n                : 1 * sortableCols[\"val\"]\n        );\n        for (var prop in sortableCols) {\n            if (prop != \"val\") {\n                sortableCols[prop] = 0;\n            }\n        }\n        sortableCols = sortableCols;\n        players = players;\n    }\n    async function optimizeLineup() {\n        const wanted = parseInt(num_lineups);\n        window.showLoadingDiv(`Optimizing Lineups... 0 / ${wanted}`);\n        try {\n            const response = await fetch(`/optimize/${league}/`, {\n                method: \"POST\",\n                headers: {\n                    \"Content-Type\": \"application/json\",\n                    Accept: \"application/x-ndjson\",\n                    \"X-CSRFToken\": window.getCookie(\"csrftoken\"), //global function\n                },\n                body: JSON.stringify({\n                    ...optimizeSettings(),\n                    num_lineups: num_lineups,\n                    stream: true,\n                }),\n            });\n            if (!response.ok) {\n                throw new Error(`optimize returned ${response.status}`);\n            }\n            // The server streams one JSON line per lineup, then a summary line,\n            // so a big build shows progress instead of a silent spinner\n            let lineups = [];\n            let summary = [];\n            let build_error = null;\n            const handleLine = (msg) => {\n                if (msg.lineup) {\n                    lineups.push(msg);\n                    window.showLoadingDiv(`Optimizing Lineups... ${lineups.length} / ${wanted}`);\n                } else if (msg.error) {\n                    build_error = msg.error;\n                } else if (msg.done) {\n                    summary = msg.summary;\n                }\n            };\n            await readNdjson(response, handleLine);\n            window.hideLoadingDiv();\n            if (lineups.length === 0) {\n                throw new Error(build_error || \"no lineups built\");\n            }\n            lineups.sort((a, b) => b.fantasy_points - a.fantasy_points);\n            generated_lineups = lineups;\n            lineups_summary = summary;\n            swap_result = null;\n            if (build_error) {\n                alert(`Only ${lineups.length} of ${wanted} lineups fit these settings. Loosen exposure, uniqueness or stacks for more.`);\n            }\n            let myModal = new bootstrap.Modal(\n                document.getElementById(\"lineup-modal\")\n            );\n            myModal.show();\n        } catch (error) {\n            window.hideLoadingDiv();\n            console.log(error);\n            alert(\"Error Creating Lineups! Please edit your criteria and try again.\");\n        }\n    }\n    function optimizeSettings() {\n        return {\n            roster: roster,\n            available_players: players,\n            slate_id: slate_id,\n            min_unique_players: min_unique_players,\n            correlation: { anti_stack: anti_stack && !anti_stack_conflict, bring_back: bring_back },\n            ruleset_name: ruleset_name,\n            strategy: strategy,\n            strategy_impact: strategy_impact,\n            exposure_strategy: exposure_strategy,\n            exposure_strategy_impact: exposure_strategy_impact,\n            gameStacks: gameStacks,\n            teamStacks: teamStacks,\n            positionStacks: positionStacks,\n            games: games,\n        };\n    }\n    // The server streams one JSON object per line; hand each to onMessage as it lands\n    async function readNdjson(response, onMessage) {\n        const reader = response.body.getReader();\n        const decoder = new TextDecoder();\n        let buffer = \"\";\n        const handleLine = (line) => {\n            if (line.trim()) onMessage(JSON.parse(line));\n        };\n        while (true) {\n            const { value, done } = await reader.read();\n            if (done) break;\n            buffer += decoder.decode(value, { stream: true });\n            let newline;\n            while ((newline = buffer.indexOf(\"\\n\")) >= 0) {\n                handleLine(buffer.slice(0, newline));\n                buffer = buffer.slice(newline + 1);\n            }\n        }\n        handleLine(buffer);\n    }\n    async function postError(response, fallback) {\n        const body = await response.json().catch(() => ({}));\n        return new Error(body.error || `${fallback} (${response.status})`);\n    }\n    // Read an entries file (DraftKings > Edit Entries, FanDuel > CSV Edit) and\n    // show what it holds before anything is done with it\n    async function loadEntriesFile(file) {\n        if (!file) return;\n        entries_busy = true;\n        try {\n            const form = new FormData();\n            form.append(\"entries_file\", file);\n            form.append(\"slot_names\", JSON.stringify(slotNames()));\n            form.append(\"games\", JSON.stringify(games));\n            const response = await fetch(`/entries/inspect/${league}/`, {\n                method: \"POST\",\n                headers: { \"X-CSRFToken\": window.getCookie(\"csrftoken\") },\n                body: form,\n            });\n            if (!response.ok) throw await postError(response, \"could not read the file\");\n            entries_info = await response.json();\n            entries_file = file;\n            swap_result = null;\n        } catch (error) {\n            console.log(error);\n            alert(`Could not read the entries file: ${error.message}`);\n        }\n        entries_busy = false;\n    }\n    function onEntriesInput(event) {\n        loadEntriesFile(event.target.files[0]);\n        event.target.value = \"\";\n    }\n    function onEntriesDrop(event) {\n        loadEntriesFile(event.dataTransfer.files[0]);\n    }\n    function clearEntriesFile() {\n        entries_file = null;\n        entries_info = null;\n        swap_result = null;\n    }\n    function matchupList(games_list) {\n        return games_list.map((g) => `${g.away}@${g.home}`).join(\", \");\n    }\n    function slotNames() {\n        return Object.values(roster).map((slot) => slot.csv_name);\n    }\n    function lineupIds(lineup_info) {\n        return lineup_info.lineup.map((player) => player.slate_id);\n    }\n    async function downloadFilledEntries(file, form) {\n        form.append(\"entries_file\", file);\n        form.append(\"slot_names\", JSON.stringify(slotNames()));\n        const response = await fetch(`/entries/fill/${league}/`, {\n            method: \"POST\",\n            headers: { \"X-CSRFToken\": window.getCookie(\"csrftoken\") },\n            body: form,\n        });\n        if (!response.ok) throw await postError(response, \"fill failed\");\n        const blob = await response.blob();\n        const link = document.createElement(\"a\");\n        link.href = URL.createObjectURL(blob);\n        link.download = file.name || \"entries.csv\";\n        link.click();\n        setTimeout(() => URL.revokeObjectURL(link.href), 10000);\n        return {\n            filled: parseInt(response.headers.get(\"X-Entries-Filled\")),\n            total: parseInt(response.headers.get(\"X-Entries-Total\")),\n        };\n    }\n    // Write the built lineups into the loaded entries file, one per entry, in order\n    async function fillEntries() {\n        try {\n            const form = new FormData();\n            form.append(\"lineups\", JSON.stringify(generated_lineups.map(lineupIds)));\n            const { filled, total } = await downloadFilledEntries(entries_file, form);\n            let note = `Filled ${filled} of ${total} entries in ${entries_file.name}. Upload it on ${entries_info.site_name}.`;\n            if (total > generated_lineups.length) {\n                note += ` The other ${total - filled} entries keep the lineups they had; build ${total} lineups to fill them all.`;\n            } else if (generated_lineups.length > total) {\n                note += ` Only the top ${total} of your ${generated_lineups.length} lineups were used.`;\n            }\n            alert(note);\n        } catch (error) {\n            console.log(error);\n            alert(`Could not fill the entries file: ${error.message}`);\n        }\n    }\n    // After a late swap, write each swapped lineup back into the entry it came from\n    async function downloadSwappedEntries() {\n        try {\n            const form = new FormData();\n            const by_entry = {};\n            for (const lineup_info of generated_lineups) {\n                if (lineup_info.entry_index !== undefined) by_entry[lineup_info.entry_index] = lineupIds(lineup_info);\n            }\n            form.append(\"lineups_by_entry\", JSON.stringify(by_entry));\n            const { filled } = await downloadFilledEntries(entries_file, form);\n            alert(`${filled} entries written to ${entries_file.name}. Upload it on ${entries_info.site_name}.`);\n        } catch (error) {\n            console.log(error);\n            alert(`Could not write the entries file: ${error.message}`);\n        }\n    }\n    // Rebuild every entry in the loaded entries file around the players whose games have started\n    async function lateSwap() {\n        window.showLoadingDiv(\"Late swapping entries... 0\");\n        try {\n            const form = new FormData();\n            form.append(\"entries_file\", entries_file);\n            form.append(\"settings\", JSON.stringify(optimizeSettings()));\n            const response = await fetch(`/entries/swap/${league}/`, {\n                method: \"POST\",\n                headers: {\n                    Accept: \"application/x-ndjson\",\n                    \"X-CSRFToken\": window.getCookie(\"csrftoken\"),\n                },\n                body: form,\n            });\n            if (!response.ok) throw await postError(response, \"late swap failed\");\n            let lineups = [];\n            let result = null;\n            let build_error = null;\n            await readNdjson(response, (msg) => {\n                if (msg.lineup) {\n                    lineups.push(msg);\n                    window.showLoadingDiv(`Late swapping entries... ${lineups.length}`);\n                } else if (msg.error) {\n                    build_error = msg.error;\n                } else if (msg.done) {\n                    result = msg;\n                }\n            });\n            window.hideLoadingDiv();\n            if (lineups.length === 0) {\n                throw new Error(build_error || (result && result.skipped.length ? result.skipped[0].reason : \"no entries could be rebuilt\"));\n            }\n            result.build_error = build_error;\n            swap_result = result;\n            generated_lineups = lineups;\n            lineups_summary = result.summary;\n        } catch (error) {\n            window.hideLoadingDiv();\n            console.log(error);\n            alert(`Late swap failed: ${error.message}`);\n        }\n    }\n    function positionsValid(player) {\n        for (var pos of player.positions) {\n            for (var key in roster) {\n                if (\n                    roster[key].fillable_by.includes(pos) &&\n                    roster[key].player == null\n                ) {\n                    return key;\n                }\n            }\n        }\n        return false;\n    }\n    function salaryValid(player) {\n        return canRosterAnywhere(player);\n    }\n    // Helpers for slot-based salary multipliers (fallback to points multiplier if salary_multiplier is missing)\n    function getSlotSalaryMultiplier(pos) {\n        const slot = roster[pos] || {};\n        if (slot.salary_multiplier != null) return slot.salary_multiplier;\n        if (slot.multiplier != null) return slot.multiplier;\n        return 1;\n    }\n    function calcSlotCost(player, pos) {\n        return Math.round(player.salary * getSlotSalaryMultiplier(pos));\n    }\n    function displayedSlotSalary(pos) {\n        const slot = roster[pos];\n        if (!slot || !slot.player) return 0;\n        return calcSlotCost(slot.player, pos);\n    }\n\n    // Find all open, fillable, and affordable slots for a player\n    function affordableSlotsFor(player) {\n        const options = [];\n        for (const key in roster) {\n            const slot = roster[key];\n            if (!slot || slot.player != null) continue;\n            for (const dp_pos of player.positions) {\n                if (slot.fillable_by.includes(dp_pos)) {\n                    const cost = calcSlotCost(player, key);\n                    if (cost <= salary) {\n                        options.push({ key, cost });\n                        break;\n                    }\n                }\n            }\n        }\n        return options;\n    }\n    // Choose the cheapest affordable slot for a player\n    function findAffordableSlot(player) {\n        const options = affordableSlotsFor(player);\n        if (options.length === 0) return false;\n        options.sort((a, b) => {\n            const am = (roster[a.key] && roster[a.key].multiplier != null) ? roster[a.key].multiplier : 1;\n            const bm = (roster[b.key] && roster[b.key].multiplier != null) ? roster[b.key].multiplier : 1;\n            if (players_rostered === 0 && am !== bm) return bm - am; // favor highest multiplier (e.g., MVP) when nothing is locked\n            return a.cost - b.cost; // otherwise cheapest slot\n        });\n        return options[0].key;\n    }\n    // Can the player be rostered in any valid slot given current salary?\n    function canRosterAnywhere(player) {\n        return affordableSlotsFor(player).length > 0;\n    }\n    function includePlayer(index) {\n        players[index].considered = true;\n    }\n    function excludePlayer(index) {\n        players[index].considered = false;\n    }\n    function rosterPlayer(index) {\n        let player = players[index];\n        let pos = findAffordableSlot(player);\n        if (!pos) {\n            alert(\"You have no open roster slots for this player!\");\n            return;\n        }\n        const cost = calcSlotCost(player, pos);\n        players.splice(index, 1);\n        players = players;\n        roster[pos].player = player;\n        salary -= cost;\n        projFP += player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        players_rostered += 1;\n    }\n    function clearRoster() {\n        for (var pos in roster) {\n            if (roster[pos].player === null) {\n                continue;\n            } else {\n                players.push(roster[pos].player);\n                roster[pos].player = null;\n            }\n        }\n        roster = roster;\n        players = players;\n        salary = startSalary;\n        projFP = 0;\n        players_rostered = 0;\n        for (var prop in sortableCols) {\n            if (sortableCols[prop] != 0) {\n                sortByX(prop, -1);\n            }\n        }\n    }\n    function unrosterPlayer(pos) {\n        if (roster[pos].player === null) {\n            return;\n        }\n        let player = roster[pos].player;\n        players.push(player);\n        players = players;\n        salary += calcSlotCost(player, pos);\n        projFP -= player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        roster[pos].player = null;\n        for (var prop in sortableCols) {\n            if (sortableCols[prop] != 0) {\n                sortByX(prop, -1);\n            }\n        }\n        players_rostered -= 1;\n    }\n    function drag(event, index) {\n        dragged_player_index = index;\n        let dragged_player = players[index];\n        setTimeout(function () {\n            event.target.classList.add(\"hide\");\n        });\n        for (var pos of dragged_player.positions) {\n            // check if pos starts with a number\n            if (pos == \"1B\") {\n                pos = \"\\\\31 B\";\n            }\n            else if(pos == \"C/1B\"){\n                pos = \"C\\\\/1B\";\n            }\n            else if(pos == \"2B\"){\n                pos = \"\\\\32 B\";\n            }\n            else if(pos == \"3B\"){\n                pos = \"\\\\33 B\";\n            }\n            document.querySelectorAll(`[class*=\"${pos}\"]`).forEach((ref) => {\n                ref.classList.add(\"highlight\");\n            });\n        }\n        const newDiv = document.createElement(\"div\");\n        newDiv.classList.add(\"drag-ele\");\n        newDiv.classList.add(\"card\");\n        newDiv.classList.add(\"px-2\");\n        newDiv.classList.add(\"d-flex\");\n        newDiv.classList.add(\"flex-row\");\n        newDiv.style.borderRadius = \"10px\";\n        const dragImg = document.createElement(\"img\");\n        dragImg.setAttribute(\"src\", dragged_player.img_thumb);\n        dragImg.classList.add(\"img-fluid\");\n        dragImg.style.height = \"100px\";\n        const playerDiv = document.createElement(\"div\");\n        playerDiv.classList.add(\"d-flex\");\n        playerDiv.classList.add(\"flex-column\");\n        playerDiv.classList.add(\"align-items-center\");\n        playerDiv.classList.add(\"justify-content-center\");\n        playerDiv.classList.add(\"text-center\");\n        const textDiv = document.createElement(\"div\");\n        textDiv.classList.add(\"d-flex\");\n        textDiv.classList.add(\"flex-column\");\n        textDiv.classList.add(\"align-items-center\");\n        textDiv.classList.add(\"justify-content-center\");\n        textDiv.classList.add(\"text-center\");\n        const imgDiv = document.createElement(\"div\");\n        const nameDiv = document.createElement(\"div\");\n        const salaryDiv = document.createElement(\"div\");\n        salaryDiv.classList.add(\"text-success\");\n        const projDiv = document.createElement(\"div\");\n        salaryDiv.style.whiteSpace = \"nowrap\";\n        projDiv.style.whiteSpace = \"nowrap\";\n        projDiv.classList.add(\"text-primary\");\n        const nameText = document.createTextNode(`${dragged_player.name}`);\n        const salaryText = document.createTextNode(\n            `💸${dragged_player.salary}`\n        );\n        const projText = document.createTextNode(`📊${dragged_player.proj}`);\n\n        imgDiv.appendChild(dragImg);\n        nameDiv.appendChild(nameText);\n        salaryDiv.appendChild(salaryText);\n        projDiv.appendChild(projText);\n        playerDiv.appendChild(imgDiv);\n        textDiv.appendChild(nameDiv);\n        textDiv.appendChild(salaryDiv);\n        textDiv.appendChild(projDiv);\n        newDiv.appendChild(playerDiv);\n        newDiv.appendChild(textDiv);\n        newDiv.style.position = \"absolute\";\n        newDiv.style.top = \"-1000px\";\n        document.body.appendChild(newDiv);\n        event.dataTransfer.setDragImage(newDiv, 230, 10);\n    }\n    function dragend(event) {\n        setTimeout(function () {\n            event.target.classList.remove(\"hide\");\n        });\n        document.querySelectorAll(\".highlight\").forEach((ele) => {\n            ele.classList.remove(\"highlight\");\n        });\n    }\n    function drop(pos) {\n        document.querySelectorAll(\".highlight\").forEach((ele) => {\n            ele.classList.remove(\"highlight\");\n        });\n        let dragged_player = players[dragged_player_index];\n        const cost = calcSlotCost(dragged_player, pos);\n        if (cost > salary) {\n            alert(\"Not enough salary to roster this player!\");\n            return;\n        }\n        players.splice(dragged_player_index, 1);\n        players = players;\n        roster[pos].player = dragged_player;\n        salary -= cost;\n        projFP += dragged_player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        players_rostered += 1;\n    }\n    function allowDrop(event, pos) {\n        let dragged_player = players[dragged_player_index];\n        let allowable = false;\n\n        for (var dp_pos of dragged_player.positions) {\n            if (roster[pos].fillable_by.includes(dp_pos)) {\n                allowable = true;\n            }\n        }\n        if (!allowable) {\n            return;\n        }\n        // Ensure sufficient salary for this slot considering multiplier\n        if (calcSlotCost(dragged_player, pos) > salary) {\n            return;\n        }\n        if (pos == \"1B\") {\n            pos = \"\\\\31 B\";\n        }\n        else if(pos == \"C/1B\"){\n            pos = \"C\\\\/1B\";\n        }\n        else if(pos == \"2B\"){\n            pos = \"\\\\32 B\";\n        }\n        else if(pos == \"3B\"){\n            pos = \"\\\\33 B\";\n        }\n        event.target.classList.add(\"over\");\n        event.preventDefault();\n    }\n    function handleLeave(event) {\n        event.target.classList.remove(\"over\");\n    }\n    function createCSVContent(include_header = true, delimiter = \",\") {\n        let csv = \"\";\n        //add the position names to top row of the csv\n        if (include_header) {\n            for (var pos in roster) {\n                csv += `${roster[pos].csv_name}${delimiter}`;\n            }\n            csv += \"\\n\";\n        }\n        //add player ids from generated_lineups to csv\n        for (var lineup_info of generated_lineups) {\n            for (var player of lineup_info.lineup) {\n                csv += `${player.slate_id}${delimiter}`;\n            }\n            csv += \"\\n\";\n        }\n        return csv;\n    }\n    function createCSV() {\n        let csv = createCSVContent();\n        //download csv\n        var hiddenElement = document.createElement(\"a\");\n        hiddenElement.href = \"data:text/csv;charset=utf-8,\" + encodeURI(csv);\n        hiddenElement.target = \"_blank\";\n        //current timestamp\n        let timestamp = new Date().getTime();\n        hiddenElement.download = `generated_linups-${timestamp}.csv`;\n        hiddenElement.click();\n    }\n    function copyToClipboard() {\n        let csv = createCSVContent(false, \"\\t\");\n        navigator.clipboard.writeText(csv);\n    }\n</script>\n\n<div\n    class=\"modal fade\"\n    id=\"premium-modal\"\n    data-bs-keyboard=\"false\"\n    tabindex=\"-1\"\n    aria-labelledby=\"staticBackdropLabel\"\n    aria-hidden=\"true\"\n>\n    <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n        <div class=\"modal-content\">\n            <div class=\"modal-body p-0\">\n                <PremiumOnly\n                    title_text={\"GigaStuds Only!\"}\n                    text={\"The ability to generate additional lineups is only available to GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"}\n                    logo_url={window.logo_url}\n                />\n            </div>\n            <div class=\"modal-footer\">\n                <div class=\"btn-group\" role=\"group\">\n                    <button\n                        type=\"button\"\n                        class=\"btn btn-secondary\"\n                        data-bs-dismiss=\"modal\">Close</button\n                    >\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<PlayerModal\n    placeholder_variances={placeholder_variances}\n    player={modal_player}\n    proj_id={modal_projection_id}\n    premium_membership={premium_membership}\n    league={league}\n/>\n{#if generated_lineups}\n    <div\n        class=\"modal fade\"\n        id=\"lineup-modal\"\n        data-bs-backdrop=\"static\"\n        data-bs-keyboard=\"false\"\n        tabindex=\"-1\"\n        aria-labelledby=\"staticBackdropLabel\"\n        aria-hidden=\"true\"\n    >\n        <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n            <div class=\"modal-content\" style=\"background: rgb(233, 236, 239);\">\n                <div class=\"modal-header\">\n                    <h5 class=\"modal-title\" id=\"staticBackdropLabel\">\n                        {#if swap_result}\n                            Late Swap Results\n                        {:else}\n                            Generated Lineups\n                        {/if}\n                    </h5>\n                    <button\n                        type=\"button\"\n                        class=\"btn-close\"\n                        data-bs-dismiss=\"modal\"\n                        aria-label=\"Close\"\n                    />\n                </div>\n                <div class=\"modal-body\">\n                    <Swiper\n                        modules={[Navigation, Pagination, Scrollbar, A11y]}\n                        spaceBetween={10}\n                        navigation={!mobile}\n                        pagination={{ type: \"progressbar\", clickable: true }}\n                        breakpoints={{\n                            320: {\n                                slidesPerView: 1,\n                                spaceBetween: 10,\n                            },\n                            768: {\n                                slidesPerView: 1,\n                                spaceBetween: 10,\n                            },\n                            1024: {\n                                slidesPerView: 2,\n                                spaceBetween: 10,\n                            },\n                            1280: {\n                                slidesPerView: 2,\n                                spaceBetween: 10,\n                            },\n                            1920: {\n                                slidesPerView: 3,\n                                spaceBetween: 10,\n                            },\n                        }}\n                    >\n                        {#each generated_lineups as lineup}\n                            <SwiperSlide\n                                ><Lineup lineup_details={lineup} /></SwiperSlide\n                            >\n                        {/each}\n                    </Swiper>\n                </div>\n                <div class=\"modal-footer\">\n                    <div class=\"btn-group flex-wrap\" role=\"group\">\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-outline-secondary\"\n                            data-bs-dismiss=\"modal\"\n                            >Generate More Lineups</button\n                        >\n                        <button\n                            class=\"btn btn-secondary\"\n                            data-bs-target=\"#summary-modal\"\n                            data-bs-toggle=\"modal\"\n                            data-bs-dismiss=\"modal\">Lineups Summary</button\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-outline-primary\"\n                            on:click={() => copyToClipboard()}>📋Copy to Clipboard</button\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-primary\"\n                            on:click={() => createCSV()}>💾Export to CSV</button\n                        >\n                        {#if premium_membership}\n                            <button\n                                type=\"button\"\n                                class=\"btn btn-success\"\n                                title=\"Write these lineups into your DraftKings or FanDuel entries file\"\n                                data-bs-target=\"#entries-modal\"\n                                data-bs-toggle=\"modal\"\n                                data-bs-dismiss=\"modal\">📂Entries File</button\n                            >\n                        {/if}\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div\n        class=\"modal fade\"\n        id=\"summary-modal\"\n        aria-hidden=\"true\"\n        aria-labelledby=\"exampleModalToggleLabel2\"\n        tabindex=\"-1\"\n    >\n        <div\n            class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-xl\"\n        >\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h5 class=\"modal-title\" id=\"exampleModalToggleLabel2\">\n                        Summary\n                    </h5>\n                    <button\n                        type=\"button\"\n                        class=\"btn-close\"\n                        data-bs-dismiss=\"modal\"\n                        aria-label=\"Close\"\n                    />\n                </div>\n                <div class=\"modal-body\">\n                    <h5>Lineups Generated: {generated_lineups.length}</h5>\n                    <h5>Distinct Players Played: {lineups_summary.length}</h5>\n                    {#if lineups_summary.length > 0}\n                        <h5>\n                            Most Played: {lineups_summary[0][1][0].name} | {lineups_summary[1][1][0]\n                                .name} | {lineups_summary[2][1][0].name}\n                        </h5>\n                        <h5>\n                            Least Played: {lineups_summary[\n                                lineups_summary.length - 1\n                            ][1][0].name} | {lineups_summary[\n                                lineups_summary.length - 2\n                            ][1][0].name} | {lineups_summary[\n                                lineups_summary.length - 3\n                            ][1][0].name}\n                        </h5>\n                    {/if}\n                    <!--table of the summary-->\n                    <table class=\"table table-hover\">\n                        <thead\n                            ><tr>\n                                <th>Player</th><th>Exposure</th><th\n                                    >Times Rostered</th\n                                >\n                            </tr></thead\n                        >\n                        <tbody>\n                            {#each lineups_summary as player}\n                                <tr\n                                    ><td class=\"pb-0\"\n                                        ><img\n                                            alt=\"{player[1][0].name}\"\n                                            loading=\"lazy\"\n                                            height=\"50\"\n                                            src={player[1][0].img_thumb}\n                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                        />{player[1][0].name}</td\n                                    ><td\n                                        >{(\n                                            player[1][1] /\n                                            generated_lineups.length\n                                        ).toFixed(2)}</td\n                                    ><td>{player[1][1]}</td></tr\n                                >\n                            {/each}\n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"modal-footer\">\n                    <button\n                        class=\"btn btn-primary\"\n                        data-bs-target=\"#lineup-modal\"\n                        data-bs-toggle=\"modal\"\n                        data-bs-dismiss=\"modal\">Back to Lineups</button\n                    >\n                </div>\n            </div>\n        </div>\n    </div>\n{/if}\n<div\n    class=\"modal fade\"\n    id=\"entries-modal\"\n    tabindex=\"-1\"\n    aria-labelledby=\"entries-modal-label\"\n    aria-hidden=\"true\"\n>\n    <div class=\"modal-dialog modal-dialog-centered modal-lg\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h5 class=\"modal-title\" id=\"entries-modal-label\">📂Entries File</h5>\n                <button\n                    type=\"button\"\n                    class=\"btn-close\"\n                    data-bs-dismiss=\"modal\"\n                    aria-label=\"Close\"\n                />\n            </div>\n            <div class=\"modal-body\">\n                {#if !entries_info}\n                    <p>\n                        Register your entries on the site first, then download the entries file:\n                        <b>DraftKings</b> Lineups → Edit Entries → Download (DKEntries.csv), or\n                        <b>FanDuel</b> Upcoming → CSV Edit → Download. Upload it here to fill it with\n                        built lineups, or to late swap it once games have started.\n                    </p>\n                    <div\n                        class=\"border rounded p-4 text-center bg-light\"\n                        on:dragover|preventDefault\n                        on:drop|preventDefault={onEntriesDrop}\n                    >\n                        <div class=\"mb-2\">Drop the file here, or</div>\n                        <label class=\"btn btn-primary\" for=\"entries-file-input\">{entries_busy ? \"Reading...\" : \"Choose File\"}</label>\n                        <input\n                            id=\"entries-file-input\"\n                            type=\"file\"\n                            accept=\".csv,text/csv\"\n                            class=\"d-none\"\n                            on:change={onEntriesInput}\n                        />\n                        <div class=\"form-text mt-2\">Don't open the file in Excel first; it mangles the player ids.</div>\n                    </div>\n                {:else}\n                    <div class=\"d-flex justify-content-between align-items-start mb-3\">\n                        <div>\n                            <div class=\"h5 mb-1\">{entries_info.site_name} · {entries_info.file_name}</div>\n                            <div>\n                                {entries_info.entries} {entries_info.entries == 1 ? \"entry\" : \"entries\"} in\n                                {entries_info.contests.map((c) => `${c.name} (${c.entries})`).join(\", \")}\n                            </div>\n                            {#if entries_info.roster_error}\n                                <div class=\"text-danger\">⚠️ {entries_info.roster_error}</div>\n                            {:else}\n                                <div class=\"text-success\">✅ Roster matches this slate: {entries_info.slot_names.join(\", \")}</div>\n                            {/if}\n                            <div>\n                                {entries_info.started_games} of {entries_info.games.length} games started{entries_info.started_games > 0 ? `: ${matchupList(entries_info.games.filter((g) => g.started))}` : \"\"}\n                            </div>\n                        </div>\n                        <button type=\"button\" class=\"btn btn-sm btn-outline-secondary text-nowrap ms-2\" on:click={() => clearEntriesFile()}>Change file</button>\n                    </div>\n                    <div class=\"row g-3\">\n                        <div class=\"col-md-6\">\n                            <div class=\"card h-100\">\n                                <div class=\"card-body d-flex flex-column\">\n                                    <h5 class=\"card-title\">📤 Fill with built lineups</h5>\n                                    <p class=\"card-text\">\n                                        Writes your built lineups into the entries, one per entry in order, and\n                                        downloads the file ready to upload back to {entries_info.site_name}.\n                                    </p>\n                                    <p class=\"card-text small text-muted\">\n                                        {#if generated_lineups.length == 0}\n                                            Build lineups first with 📈Optimize.\n                                        {:else}\n                                            {generated_lineups.length} lineups ready for {entries_info.entries} entries.\n                                            {#if generated_lineups.length < entries_info.entries}\n                                                The other {entries_info.entries - generated_lineups.length} keep their current lineups.\n                                            {:else if generated_lineups.length > entries_info.entries}\n                                                The top {entries_info.entries} are used.\n                                            {/if}\n                                        {/if}\n                                    </p>\n                                    <button\n                                        type=\"button\"\n                                        class=\"btn btn-primary mt-auto\"\n                                        disabled={generated_lineups.length == 0 || entries_info.roster_error}\n                                        on:click={() => fillEntries()}>Fill &amp; Download</button\n                                    >\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"col-md-6\">\n                            <div class=\"card h-100\">\n                                <div class=\"card-body d-flex flex-column\">\n                                    <h5 class=\"card-title\">🔄 Late swap</h5>\n                                    <p class=\"card-text\">\n                                        Keeps every player whose game has started where he is and rebuilds the open\n                                        slots of each entry with the current projections and your Advanced Settings.\n                                    </p>\n                                    {#if swap_result}\n                                        <p class=\"card-text small text-muted\">\n                                            {swap_result.changed} of {swap_result.built} entries changed.\n                                            {#if swap_result.skipped.length}\n                                                {swap_result.skipped.length} skipped: {swap_result.skipped.slice(0, 3).map((s) => `#${s.entry_id} (${s.reason})`).join(\"; \")}\n                                            {/if}\n                                            {#if swap_result.build_error}\n                                                Stopped early: {swap_result.build_error}\n                                            {/if}\n                                        </p>\n                                        <div class=\"btn-group mt-auto\">\n                                            <button\n                                                type=\"button\"\n                                                class=\"btn btn-outline-primary\"\n                                                data-bs-target=\"#lineup-modal\"\n                                                data-bs-toggle=\"modal\"\n                                                data-bs-dismiss=\"modal\">Review Lineups</button\n                                            >\n                                            <button type=\"button\" class=\"btn btn-success\" on:click={() => downloadSwappedEntries()}>Download Entries File</button>\n                                        </div>\n                                    {:else}\n                                        <p class=\"card-text small text-muted\">\n                                            {#if entries_info.started_games == 0}\n                                                Available once a game on this slate has started.\n                                            {:else}\n                                                Players in {matchupList(entries_info.games.filter((g) => g.started))} stay locked; everyone else is up for review.\n                                            {/if}\n                                        </p>\n                                        <button\n                                            type=\"button\"\n                                            class=\"btn btn-primary mt-auto\"\n                                            disabled={entries_info.started_games == 0 || entries_info.roster_error}\n                                            on:click={() => lateSwap()}>Late Swap</button\n                                        >\n                                    {/if}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                {/if}\n            </div>\n        </div>\n    </div>\n</div>\n<div\n    class=\"modal fade\"\n    id=\"settings-modal\"\n    tabindex=\"-1\"\n    aria-labelledby=\"settings-modal-label\"\n    aria-hidden=\"true\"\n>\n    <div class=\"modal-dialog modal-xl\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h5 class=\"modal-title\" id=\"settings-modal-label\">\n                    ⚙️Advanced Settings\n                </h5>\n                <button\n                    type=\"button\"\n                    class=\"btn-close\"\n                    data-bs-dismiss=\"modal\"\n                    aria-label=\"Close\"\n                />\n            </div>\n            <div class=\"modal-body\">\n                {#if premium_membership}\n                    <h4>Fantasy Points Strategy</h4>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio1\"\n                            value={\"projection\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio1\"\n                            >Projection only</label\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio2\"\n                            value={\"random\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio2\"\n                            >Randomization</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Randomization adds some deviation for players projection for creating less optimized but more randomized lineups. Low sets the max deviation to 12%, Mid to 18%, and High to 24%\"\n                            >❔</button\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio3\"\n                            value={\"progressive\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio3\"\n                            >Progressive</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Progressive increases fantasy points for each player that wasn’t used in the previous lineup by some specified percent (Low 1%, Mid 2%, High 3%) of original fantasy points. It works cumulatively so fantasy points will be greater if the player wasn’t used in the lineup multiple times. After the player will be selected to lineup his points will be reset to the original value. This method will automatically exclude players with non-viable value projections.\"\n                            >❔</button\n                        >\n                    </div>\n                    {#if strategy != \"projection\"}\n                        <!--slider to select low medium high for strategy impact-->\n                        <div class=\"form-group\">\n                            <label for=\"customRange2\" class=\"form-label h6\"\n                                >Strategy Impact -\n                                {#if strategy_impact == 0}\n                                    Low\n                                {:else if strategy_impact == 1}\n                                    Medium\n                                {:else if strategy_impact == 2}\n                                    High\n                                {/if}\n                            </label>\n                            <input\n                                type=\"range\"\n                                bind:value={strategy_impact}\n                                class=\"form-range\"\n                                min=\"0\"\n                                max=\"2\"\n                                id=\"customRange2\"\n                            />\n                        </div>\n                    {/if}\n                    <hr />\n                    <h4>Exposure Strategy</h4>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"exposure_strategy\"\n                            bind:group={exposure_strategy}\n                            id=\"exposeRadio1\"\n                            value={\"none\"}\n                        />\n                        <label class=\"form-check-label\" for=\"exposeRadio1\"\n                            >None</label\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"exposure_strategy\"\n                            bind:group={exposure_strategy}\n                            id=\"exposeRadio2\"\n                            value={\"exposure\"}\n                        />\n                        <label class=\"form-check-label\" for=\"exposeRadio2\"\n                            >Limit Exposure</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Limiting Exposure limits the maximum percentage of lineups that a player can appear in. Note: Locking a player ignores maximum exposure and they will still appear in every lineup.\"\n                            >❔</button\n                        >\n                    </div>\n                    {#if exposure_strategy != \"none\"}\n                        <!--slider to select low medium high for strategy impact-->\n                        <div class=\"form-group\">\n                            <label for=\"customRange3\" class=\"form-label h6\"\n                                >Max Exposure - {exposure_strategy_impact}</label\n                            >\n                            <input\n                                type=\"range\"\n                                bind:value={exposure_strategy_impact}\n                                class=\"form-range\"\n                                min=\"0\"\n                                step=\".01\"\n                                max=\"1\"\n                                id=\"customRange3\"\n                            />\n                        </div>\n                    {/if}\n                    <h4>Lineup Diversity</h4>\n                    <div class=\"form-group\">\n                        <label for=\"min-unique-range\" class=\"form-label h6\"\n                            >Min Unique Players Between Lineups - {min_unique_players}</label\n                        >\n                        <input\n                            type=\"range\"\n                            bind:value={min_unique_players}\n                            class=\"form-range\"\n                            min=\"1\"\n                            step=\"1\"\n                            max=\"4\"\n                            id=\"min-unique-range\"\n                        />\n                        <p class=\"text-muted small mb-0\">Every lineup must differ from every other lineup by at least this many players. Most tournament builders run 2 or 3.</p>\n                    </div>\n                    {#if league in ANTI_STACK}\n                        <hr />\n                        <h4>Correlation</h4>\n                        <div class=\"form-check\">\n                            <input\n                                class=\"form-check-input\"\n                                type=\"checkbox\"\n                                id=\"anti-stack\"\n                                bind:checked={anti_stack}\n                                disabled={anti_stack_conflict != null}\n                            />\n                            <label class=\"form-check-label\" for=\"anti-stack\">{ANTI_STACK[league].label}</label>\n                        </div>\n                        <p class=\"text-muted small mb-0\">\n                            {#if anti_stack_conflict}\n                                Off for this build: {anti_stack_conflict}.\n                            {:else if single_game_slate}\n                                Every player here is in the one game, so this keeps a {league == \"nfl\" ? \"defense\" : league == \"mlb\" ? \"pitcher\" : \"goalie\"} off any lineup with the other side's players. Off by default for single game slates.\n                            {:else}\n                                {ANTI_STACK[league].why}\n                            {/if}\n                        </p>\n                        {#if league == \"nfl\" && !single_game_slate}\n                            <div class=\"form-check mt-2\">\n                                <input class=\"form-check-input\" type=\"checkbox\" id=\"bring-back\" bind:checked={bring_back} />\n                                <label class=\"form-check-label\" for=\"bring-back\">Bring back a WR or TE from the other side with my QB</label>\n                            </div>\n                            <p class=\"text-muted small mb-0\">A shootout lifts both passing games; the bring-back keeps a piece of the other one.</p>\n                        {/if}\n                    {/if}\n                        <hr />\n                        <h4 class=\"text-center\">Stacking</h4>\n                        {#if games.length > 1}\n                        <div>\n                            <h5>Game Stack</h5>\n                            <p>Specify how many \n                            {#if league == \"mlb\"}\n                                batters\n                            {:else}\n                                players\n                            {/if} you want from the same game</p>\n                            {#each gameStacks as gs}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    <div class=\"col-12\">At Least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"2\" max=\"8\" class=\"form-control\" bind:value={gs.min} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                    {#if league == \"mlb\"}\n                                        batter(s)\n                                    {:else}\n                                        player(s)\n                                    {/if} from the same game with at least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"1\" max=\"4\" class=\"form-control\" bind:value={gs.min_each_team} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                    {#if league == \"mlb\"}\n                                        batter(s)\n                                    {:else}\n                                        player(s)\n                                    {/if} from each team</div>\n                                    \n                                    <div style=\"cursor:pointer;\" on:click={() => {gameStacks = gameStacks.filter(function(item){return item !== gs})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                {#if gameStacks.length == 0}\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {gameStacks=[];gameStacks.push({min: 2, game: games[0].game_id, min_each_team: 1}); gameStacks=gameStacks;}}\n                                >Add a Game Stack</button>\n                                {/if}\n                            </div>\n                        </div>\n                        <hr>\n                        {/if}\n                        <div>\n                            <h5>Team Stacks</h5>\n                            <p>Specify how many \n                            {#if league == \"mlb\"}\n                                batters\n                            {:else}\n                                players\n                            {/if} you want from certain teams</p>\n                            {#each teamStacks as ts}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    <div class=\"col-12\">At Least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"1\" max=\"4\" class=\"form-control\" bind:value={ts.min} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                        {#if league == \"mlb\"}\n                                            batter(s)\n                                        {:else}\n                                            player(s)\n                                        {/if}\n                                     from the</div>\n                                    <div class=\"col-12\">\n                                    <select class=\"form-select\" bind:value={ts.team}>\n                                        {#each teams as team}\n                                            <option value={team.short_name}\n                                                >{team.city} {team.mascot}</option\n                                            >\n                                        {/each}\n                                        </select>\n                                    </div>\n                                    <div style=\"cursor:pointer;\" on:click={() => {teamStacks = teamStacks.filter(function(item){return item !== ts})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {teamStacks.push({min: 2, team: teams[0].short_name}); teamStacks=teamStacks;}}\n                                >Add a Team Stack</button>\n                            </div>\n                        </div>\n                        <hr>\n\n                        <div>\n                            <h5>Position Stacks</h5>\n                            <p>The Optimizer will create lineups with \n                                {#if league == \"mlb\"}\n                                    batters\n                                {:else}\n                                    players\n                                {/if}\n                            on the same team that play the specified positions. You can select more than one position per dropdown.</p>\n                            {#each positionStacks as ps}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    {#each ps.positions as pos}\n                                        <div class=\"col-12\">\n                                            \n                                            <select class=\"form-select\" bind:value={pos} multiple>\n                                                {#if league == \"nfl\"}\n                                                <option value=\"QB\">QB</option>\n                                                <option value=\"RB\">RB</option>\n                                                <option value=\"WR\">WR</option>\n                                                <option value=\"TE\">TE</option>\n                                                <option value=\"DST\">DST</option>\n                                                {/if}\n                                                {#if league == \"nba\"}\n                                                <option value=\"PG\">PG</option>\n                                                <option value=\"SG\">SG</option>\n                                                <option value=\"SF\">SF</option>\n                                                <option value=\"PF\">PF</option>\n                                                <option value=\"C\">C</option>\n                                                {/if}\n                                                {#if league == \"mlb\"}\n                                                <option value=\"P\">P</option>\n                                                <option value=\"C\">C</option>\n                                                <option value=\"\\1B\">1B</option>\n                                                <option value=\"\\2B\">2B</option>\n                                                <option value=\"\\3B\">3B</option>\n                                                <option value=\"SS\">SS</option>\n                                                <option value=\"OF\">OF</option>\n                                                {/if}\n                                                {#if league == \"nhl\"}\n                                                <option value=\"C\">C</option>\n                                                <option value=\"W\">W</option>\n                                                <option value=\"D\">D</option>\n                                                <option value=\"G\">G</option>\n                                                {/if}\n                                            </select>\n                                        </div>\n                                    {/each}\n                                    <div class=\"col-12\">\n                                        <button\n                                        type=\"button\"\n                                        class=\"btn btn-primary mx-auto\"\n                                        on:click={() => {\n                                            if (league == \"nfl\"){\n                                                ps.positions.push(\"QB\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"nba\"){\n                                                ps.positions.push(\"PG\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"mlb\"){\n                                                ps.positions.push(\"C\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"nhl\"){\n                                                ps.positions.push(\"C\"); ps.positions=ps.positions;\n                                            }\n                                            }}\n                                        >Add a Position Group</button>\n                                    </div>\n                                    <div style=\"cursor:pointer;\" on:click={() => {positionStacks = positionStacks.filter(function(item){return item !== ps})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {\n                                    let my_stack = {positions: []};\n                                    if (league == \"nfl\"){\n                                        my_stack.positions.push(\"QB\");\n                                        my_stack.positions.push(\"WR\");\n                                    }\n                                    if (league == \"nba\"){\n                                        my_stack.positions.push(\"PG\");\n                                        my_stack.positions.push(\"PF\");\n                                    }\n                                    if (league == \"mlb\"){\n                                        my_stack.positions.push(\"C\");\n                                        my_stack.positions.push(\"OF\");\n                                    }\n                                    if (league == \"nhl\"){\n                                        my_stack.positions.push(\"C\");\n                                        my_stack.positions.push(\"W\");\n                                    }\n                                    positionStacks.push(my_stack);\n                                    positionStacks=positionStacks;\n                                }}\n                                >Add a Position Stack</button>\n                            </div>\n                        </div>\n                {:else}\n                    <PremiumOnly\n                        title_text={\"GigaStuds Only!\"}\n                        text={\"Advanced Lineup Settings are only available to GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"}\n                        logo_url={window.logo_url}\n                    />\n                {/if}\n            </div>\n\n            <div class=\"modal-footer\">\n                <button\n                    type=\"button\"\n                    class=\"btn btn-secondary\"\n                    data-bs-dismiss=\"modal\">Close</button\n                >\n            </div>\n        </div>\n    </div>\n</div>\n<div\n    style=\"background-color:#e9ecef;\"\n    class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\"\n>\n    <h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n    <Swiper\n        modules={[Navigation, Pagination, Scrollbar, A11y]}\n        spaceBetween={10}\n        navigation={!mobile}\n        pagination={{ clickable: true }}\n        breakpoints={{\n            320: {\n                slidesPerView: 1,\n                spaceBetween: 10,\n            },\n            768: {\n                slidesPerView: 2,\n                spaceBetween: 10,\n            },\n            1024: {\n                slidesPerView: 3,\n                spaceBetween: 10,\n            },\n            1280: {\n                slidesPerView: 4,\n                spaceBetween: 10,\n            },\n            1920: {\n                slidesPerView: 5,\n                spaceBetween: 10,\n            },\n        }}\n    >\n        {#each games as game}\n            <SwiperSlide\n                ><GameCard\n                    home_team={game.home_team}\n                    away_team={game.away_team}\n                    game_time={game.game_time}\n                    lines={game.lines}\n                /></SwiperSlide\n            >\n        {/each}\n    </Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-lg-8\">\n            <div class=\"row\">\n                {#if showSlateSelect()}\n                    <div class=\"col-lg-5 mb-1\">\n                        <label for=\"slate-select\">Choose a Slate</label>\n                        <select\n                            :value={slate_id}\n                            on:change={() => {\n                                window.location =\n                                    document.getElementById(\n                                        \"slate-select\"\n                                    ).value;\n                            }}\n                            class=\"form-select form-select-lg\"\n                            id=\"slate-select\"\n                        >\n                            {#each upcoming_slates as slate}\n                                {#if slate.slate_id == slate_id}\n                                    <option value={slate.slate_id} selected\n                                        >{slate.slate_name}</option\n                                    >\n                                {:else}\n                                    <option value={slate.slate_id}\n                                        >{slate.slate_name}</option\n                                    >\n                                {/if}\n                            {/each}\n                        </select>\n                    </div>\n                {/if}\n                <div class=\"col-lg-5 mb-1\">\n                    <label for=\"team-select\">Filter By Team</label>\n                    <select\n                        bind:value={selectedTeam}\n                        on:change={() => {\n                            players = players;\n                        }}\n                        class=\"form-select form-select-lg\"\n                        id=\"team-select\"\n                    >\n                        <option value=\"all\">All</option>\n                        {#each teams as team}\n                            <option value={team.short_name}\n                                >{team.city} {team.mascot}</option\n                            >\n                        {/each}\n                    </select>\n                </div>\n                {#if premium_membership}\n                    <div class=\"col-lg-2 mb-1\">\n                        <label for=\"num-lineup\">Lineups</label>\n                        <select\n                            bind:value={num_lineups}\n                            id=\"num-lineup\"\n                            class=\"form-select form-select-lg\"\n                            aria-label=\".form-select-lg example\"\n                        >\n                            <option value=\"1\">1</option>\n                            <option value=\"3\">3</option>\n                            <option value=\"5\">5</option>\n                            <option value=\"10\">10</option>\n                            <option value=\"25\">25</option>\n                            <option value=\"50\">50</option>\n                            <option value=\"100\">100</option>\n                            <option value=\"150\">150</option>\n                        </select>\n                        {#if parseInt(num_lineups) >= 50 && strategy == \"projection\" && exposure_strategy == \"none\"}\n                            <div class=\"form-text\">Big projection-only builds can take a few minutes. Randomization or an exposure limit in ⚙️ Advanced Settings finishes in a fraction of the time and spreads the lineups out.</div>\n                        {/if}\n                    </div>\n                {:else}\n                    <div\n                        class=\"col-lg-2 mb-1\"\n                        on:click={() => {\n                            showPremiumModal();\n                        }}\n                    >\n                        <label for=\"num-lineup\">Lineups</label>\n                        <div style=\"cursor: not-allowed;\">\n                            <select\n                                disabled\n                                bind:value={num_lineups}\n                                id=\"num-lineup\"\n                                class=\"form-select form-select-lg\"\n                                aria-label=\".form-select-lg example\"\n                                style=\"pointer-events:none;\"\n                            >\n                                <option value=\"1\">1</option>\n                                <option value=\"3\">3</option>\n                            </select>\n                        </div>\n                    </div>\n                {/if}\n            </div>\n            <div>\n                <ul class=\"nav nav-pills mb-3 h4\" id=\"pills-tab\" role=\"tablist\">\n                    <li class=\"nav-item\" role=\"presentation\">\n                        <button\n                            class=\"nav-link active\"\n                            id=\"pills-consider-tab\"\n                            data-bs-toggle=\"pill\"\n                            data-bs-target=\"#pills-consider\"\n                            type=\"button\"\n                            role=\"tab\"\n                            aria-controls=\"pills-consider\"\n                            aria-selected=\"true\">Considering</button\n                        >\n                    </li>\n                    <li class=\"nav-item\" role=\"presentation\">\n                        <button\n                            class=\"nav-link\"\n                            id=\"pills-exclude-tab\"\n                            data-bs-toggle=\"pill\"\n                            data-bs-target=\"#pills-exclude\"\n                            type=\"button\"\n                            role=\"tab\"\n                            aria-controls=\"pills-exclude\"\n                            aria-selected=\"false\">Excluded</button\n                        >\n                    </li>\n                    <div class=\"my-auto\">\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-lg btn-secondary\"\n                            data-bs-toggle=\"modal\"\n                            data-bs-target=\"#settings-modal\"\n                            >⚙️Advanced Settings</button\n                        >\n                        {#if premium_membership}\n                            <button\n                                type=\"button\"\n                                class=\"btn btn-lg btn-outline-secondary ms-1\"\n                                data-bs-toggle=\"modal\"\n                                data-bs-target=\"#entries-modal\"\n                                title=\"Upload your DraftKings or FanDuel entries file to fill it with lineups, or to late swap it once games have started\"\n                                >📂Entries File</button\n                            >\n                        {/if}\n                    </div>\n                </ul>\n                <div class=\"row d-lg-none\">\n                    <div\n                        class=\"col-12 mb-2 col-12 mb-2 d-flex align-items-center\"\n                    >\n                        <span class=\"h6 me-auto\">\n                            ${salary.toLocaleString()} Rem | {projFP} proj | {players_rostered}\n                            / {roster_size} Locked</span\n                        ><button\n                            class=\"btn btn-primary\"\n                            type=\"button\"\n                            data-bs-toggle=\"offcanvas\"\n                            data-bs-target=\"#offcanvasScrolling\"\n                            aria-controls=\"offcanvasScrolling\"\n                            >Show Roster</button\n                        >\n                    </div>\n                </div>\n                <div class=\"row pb-2\">\n                    <div class=\"col-xl-4 mb-1\">\n                        <div\n                            class=\"d-flex align-items-center h-100 btn-group\"\n                            role=\"group\"\n                            aria-label=\"Basic radio toggle button group\"\n                        >\n                            <input\n                                type=\"radio\"\n                                bind:group={pos_filter}\n                                on:click={() => (players = players)}\n                                value=\"all\"\n                                class=\"btn-check\"\n                                name=\"btnradio\"\n                                id=\"btnradio1\"\n                                autocomplete=\"off\"\n                            />\n                            <label\n                                class=\"w-100 btn btn-outline-primary\"\n                                for=\"btnradio1\">All</label\n                            >\n                            {#each position_filters as position, index}\n                                <input\n                                    type=\"radio\"\n                                    bind:group={pos_filter}\n                                    on:click={() => (players = players)}\n                                    class=\"btn-check\"\n                                    name=\"btnradio\"\n                                    id=\"btnradio{index + 2}\"\n                                    value={position}\n                                    autocomplete=\"off\"\n                                />\n                                <label\n                                    class=\"w-100 btn btn-outline-primary\"\n                                    for=\"btnradio{index + 2}\">{position}</label\n                                >\n                            {/each}\n                        </div>\n                    </div>\n                    <div class=\"col-xl-4 mb-1\">\n                        <div class=\"input-group flex-nowrap input-group-lg\">\n                            <span\n                                class=\"input-group-text\"\n                                id=\"inputGroup-sizing-lg\">🔍</span\n                            >\n                            <input\n                                on:keyup={() => {\n                                    setTimeout((players = players), 500);\n                                }}\n                                bind:value={playerSearchString}\n                                autocomplete=\"off\"\n                                id=\"player-search\"\n                                type=\"text\"\n                                class=\"form-control\"\n                                aria-label=\"Sizing example input\"\n                                placeholder=\"Search for a Player...\"\n                                aria-describedby=\"inputGroup-sizing-lg\"\n                            />\n                        </div>\n                    </div>\n                    <div class=\"col-xl-4 mb-1\">\n                        <div class=\"d-flex\">\n                            <button\n                                on:click={() => clearRoster()}\n                                class=\"w-50 me-1 btn btn-lg btn-danger\"\n                            >\n                                🚫Reset\n                            </button>\n                            <button\n                                on:click={() => optimizeLineup()}\n                                class=\"w-50 ms-1 btn btn-lg btn-primary\" style=\"white-space: nowrap;\"\n                            >\n                                📈Optimize\n                            </button>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"tab-content\" id=\"pills-tabContent\">\n                    <div\n                        class=\"tab-pane fade show active\"\n                        id=\"pills-consider\"\n                        role=\"tabpanel\"\n                        aria-labelledby=\"pills-consider-tab\"\n                    >\n                        <div class=\"d-md-none\">\n                            <div class=\"\">\n                                {#each players as player, index}\n                                    {#if canRosterAnywhere(player) && player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={true}\n                                            {includePlayer}\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {:else if player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={true}\n                                            {includePlayer}\n                                            rosterable=\"unrosterable\"\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {/if}\n                                {/each}\n                            </div>\n                        </div>\n\n                        <div\n                            class=\"table-responsive card modern-card p-3 d-none d-md-block\"\n                            id=\"considered-players\"\n                        >\n                            <table class=\"table\">\n                                <thead class=\"text-center\">\n                                    {#if sortableCols[\"name\"] == 1}\n                                        <th\n                                            class=\"text-start sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else if sortableCols[\"name\"] == -1}\n                                        <th\n                                            class=\"text-start sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else}\n                                        <th\n                                            draggable=\"true\"\n                                            class=\"text-start sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"salary\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else if sortableCols[\"salary\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"proj\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else if sortableCols[\"proj\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"val\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else if sortableCols[\"val\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {/if}\n                                    <th>Lock</th><th>Exclude</th>\n                                </thead>\n                                <tbody>\n                                    {#each players as player, index}\n                                        {#if canRosterAnywhere(player) && player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr\n                                                class=\"draggable\"\n                                                draggable=\"true\"\n                                                on:dragend={function (event) {\n                                                    dragend(event);\n                                                }}\n                                                on:dragstart={(event) =>\n                                                    drag(event, index)}\n                                            >\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                >\n                                                <td class=\"text-primary\">\n                                                    <div\n                                                        style=\"width:fit-content;\"\n                                                        class=\"input-group flex-nowrap mx-auto\"\n                                                    >\n                                                        <span\n                                                            class=\"input-group-text\"\n                                                            >📊</span\n                                                        >\n                                                        <input\n                                                            class=\"form-control\"\n                                                            style=\"width:75px;\"\n                                                            type=\"number\"\n                                                            bind:value={player.proj}\n                                                        />\n                                                    </div>\n                                                </td>\n                                                <td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer h5 text-center\"\n                                                    on:click={() =>\n                                                        rosterPlayer(index)}\n                                                    >🔒</td\n                                                ><td\n                                                    class=\"text-center h5 pointer\"\n                                                    on:click={() =>\n                                                        excludePlayer(index)}\n                                                    >❌</td\n                                                ></tr\n                                            >\n                                        {:else if player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr class=\"unrosterable\">\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                >\n                                                <td class=\"text-primary\">\n                                                    <div\n                                                        style=\"width:fit-content;\"\n                                                        class=\"input-group flex-nowrap mx-auto\"\n                                                    >\n                                                        <span\n                                                            class=\"input-group-text\"\n                                                            >📊</span\n                                                        >\n                                                        <input\n                                                            class=\"form-control\"\n                                                            style=\"width:75px;\"\n                                                            type=\"number\"\n                                                            bind:value={player.proj}\n                                                        />\n                                                    </div>\n                                                </td>\n                                                <td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        rosterPlayer(index)}\n                                                    >🔒</td\n                                                ><td\n                                                    class=\"pointer h5 text-center\"\n                                                    on:click={() =>\n                                                        excludePlayer(index)}\n                                                    >❌</td\n                                                ></tr\n                                            >\n                                        {/if}\n                                    {/each}\n                                </tbody>\n                            </table>\n                        </div>\n                    </div>\n                    <div\n                        class=\"tab-pane fade\"\n                        id=\"pills-exclude\"\n                        role=\"tabpanel\"\n                        aria-labelledby=\"pills-exclude-tab\"\n                    >\n                        <div class=\"d-md-none\">\n                            <div class=\"\">\n                                {#each players as player, index}\n                                    {#if canRosterAnywhere(player) && !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={false}\n                                            {includePlayer}\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {:else if !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={false}\n                                            {includePlayer}\n                                            rosterable=\"unrosterable\"\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {/if}\n                                {/each}\n                            </div>\n                        </div>\n                        <div\n                            class=\"table-responsive modern-card p-3 d-none d-md-block\"\n                            id=\"excluded-players\"\n                        >\n                            <table class=\"table\">\n                                <thead class=\"text-center\">\n                                    {#if sortableCols[\"name\"] == 1}\n                                        <th\n                                            class=\"text-start sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else if sortableCols[\"name\"] == -1}\n                                        <th\n                                            class=\"text-start sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else}\n                                        <th\n                                            draggable=\"true\"\n                                            class=\"text-start sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"salary\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else if sortableCols[\"salary\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"proj\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else if sortableCols[\"proj\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"val\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else if sortableCols[\"val\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {/if}\n                                    <th>Include</th>\n                                </thead>\n                                <tbody>\n                                    {#each players as player, index}\n                                        {#if canRosterAnywhere(player) && !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr>\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                ><td class=\"text-primary\"\n                                                    >📊{player.proj}</td\n                                                ><td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        includePlayer(index)}\n                                                    >✔️</td\n                                                ></tr\n                                            >\n                                        {:else if !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr class=\"unrosterable\">\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            loading=\"lazy\"\n                                                            alt=\"{player.name}\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                ><td class=\"text-primary\"\n                                                    >📊{player.proj}</td\n                                                ><td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        includePlayer(index)}\n                                                    >✔️</td\n                                                ></tr\n                                            >\n                                        {/if}\n                                    {/each}\n                                </tbody>\n                            </table>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"col-lg-4 d-none d-lg-block\">\n            <div class=\"roster-holder card modern-card\">\n                <div class=\"px-3 d-flex h5 bold text-center border-bottom py-2\">\n                    <div id=\"salary-summary\" class=\"px-3\">\n                        <div>Salary</div>\n                        <div>${salary.toLocaleString()}</div>\n                    </div>\n                    <div id=\"fp-summary\" class=\"px-3\">\n                        <div>Projection</div>\n                        <div>{projFP} FP</div>\n                    </div>\n                </div>\n                <div class=\"d-flex flex-column\">\n                    {#each Object.entries(roster) as [pos, slot]}\n                        {#if slot.player}\n                            <div\n                                style=\"border-radius: 10px;\"\n                                class=\"px-3 hidden-border border-bottom roster-slot d-flex align-items-center\"\n                            >\n                                <div class=\"display-5 col-4\">\n                                    <img\n                                        alt=\"{slot.player.name}\"\n                                        height=\"70\"\n                                        src={slot.player.img_thumb}\n                                        loading=\"lazy\"\n                                        onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                    />\n                                </div>\n                                <div\n                                    class=\"col-8 h6 my-0 d-flex align-items-center\"\n                                >\n                                    <div class=\"d-flex flex-column\">\n                                        <div>\n                                            {slot.player.name}\n                                            {#if slot.player.inj_tag == \"O\"}\n                                                <span class=\"badge bg-danger\"\n                                                    >OUT</span\n                                                >\n                                            {:else if slot.player.inj_tag == \"Q\" || slot.player.inj_tag == \"D\" || slot.player.inj_tag == \"GTD\"}\n                                                <span class=\"badge bg-warning\"\n                                                    >{slot.player.inj_tag}</span\n                                                >\n                                            {/if}\n                                        </div>\n                                        <div>\n                                            <span class=\"text-success\" style=\"white-space: nowrap;\"\n                                                >💸{displayedSlotSalary(pos).toLocaleString()}</span\n                                            >\n                                            |\n                                            <span class=\"text-primary\"\n                                                >📊{slot.player.proj}</span\n                                            >\n                                        </div>\n                                    </div>\n                                    <span\n                                        class=\"ms-auto h5 pointer\"\n                                        on:click={() => unrosterPlayer(pos)}\n                                        >🔓</span\n                                    >\n                                </div>\n                            </div>\n                        {:else}\n                            <div\n                                style=\"border-radius: 10px;\"\n                                on:drop={drop(pos)}\n                                on:dragover={function (event) {\n                                    allowDrop(event, pos);\n                                }}\n                                on:dragleave={function (event) {\n                                    handleLeave(event);\n                                }}\n                                class=\"hidden-border roster-slot {slot.fillable_by\n                                    .replaceAll(',', ' ')\n                                    .replaceAll('[', '')\n                                    .replaceAll(']', '')\n                                    .replaceAll(\"'\", '')\n                                    .replaceAll(\n                                        '\"',\n                                        ''\n                                    )} {pos} d-flex align-items-center py-2 px-3\"\n                            >\n                                <div class=\"no-pointer-events display-5 col-4\">\n                                    {slot.display_name}\n                                </div>\n                                <div\n                                    class=\"no-pointer-events col-8 h6 my-0 d-flex align-items-center\"\n                                >\n                                    Choose a Player\n                                </div>\n                            </div>\n                        {/if}\n                    {/each}\n                </div>\n            </div>\n        </div>\n        <div\n            class=\"offcanvas offcanvas-end d-lg-none\"\n            data-bs-scroll=\"true\"\n            data-bs-backdrop=\"false\"\n            tabindex=\"-1\"\n            id=\"offcanvasScrolling\"\n            aria-labelledby=\"offcanvasScrollingLabel\"\n        >\n            <div class=\"offcanvas-header\">\n                <div class=\"d-flex h5 bold text-center border-bottom py-2\">\n                    <div id=\"salary-summary\" class=\"px-3\">\n                        <div>Salary</div>\n                        <div>${salary.toLocaleString()}</div>\n                    </div>\n                    <div id=\"fp-summary\" class=\"px-3\">\n                        <div>Projection</div>\n                        <div>{projFP} FP</div>\n                    </div>\n                </div>\n                <button\n                    type=\"button\"\n                    class=\"btn-close text-reset\"\n                    data-bs-dismiss=\"offcanvas\"\n                    aria-label=\"Close\"\n                />\n            </div>\n            <div class=\"offcanvas-body\">\n                <div class=\"roster-holder\">\n                    <div class=\"d-flex flex-column\">\n                        {#each Object.entries(roster) as [pos, slot]}\n                            {#if slot.player}\n                                <div\n                                    class=\"hidden-border border-bottom roster-slot d-flex align-items-center\"\n                                >\n                                    <div class=\"display-5 col-4\">\n                                        <img\n                                            alt=\"{slot.player.name}\"\n                                            height=\"70\"\n                                            src={slot.player.img_thumb}\n                                            loading=\"lazy\"\n                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                        />\n                                    </div>\n                                    <div\n                                        class=\"col-8 h6 my-0 d-flex align-items-center\"\n                                    >\n                                        <div class=\"d-flex flex-column\">\n                                            <div>\n                                                {slot.player.name}\n                                                <div>\n                                                    {#if slot.player.inj_tag == \"O\"}\n                                                        <span\n                                                            class=\"badge bg-danger\"\n                                                            >OUT</span\n                                                        >\n                                                    {:else if slot.player.inj_tag == \"Q\" || slot.player.inj_tag == \"D\" || slot.player.inj_tag == \"GTD\"}\n                                                        <span\n                                                            class=\"badge bg-warning\"\n                                                            >{slot.player\n                                                                .inj_tag}</span\n                                                        >\n                                                    {/if}\n                                                </div>\n                                            </div>\n                                            <div>\n                                                <span class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{displayedSlotSalary(pos).toLocaleString()}</span\n                                                >\n                                                |\n                                                <span class=\"text-primary\"\n                                                    >📊{slot.player.proj}</span\n                                                >\n                                            </div>\n                                        </div>\n                                        <span\n                                            class=\"ms-auto h5 pointer\"\n                                            on:click={() => unrosterPlayer(pos)}\n                                            >🔓</span\n                                        >\n                                    </div>\n                                </div>\n                            {:else}\n                                <div\n                                    on:drop={drop(pos)}\n                                    on:dragover={function (event) {\n                                        allowDrop(event, pos);\n                                    }}\n                                    on:dragleave={function (event) {\n                                        handleLeave(event);\n                                    }}\n                                    class=\"hidden-border roster-slot {slot.fillable_by\n                                        .replaceAll(',', ' ')\n                                        .replaceAll('[', '')\n                                        .replaceAll(']', '')\n                                        .replaceAll(\"'\", '')\n                                        .replaceAll(\n                                            '\"',\n                                            ''\n                                        )} {pos} d-flex align-items-center py-2\"\n                                >\n                                    <div class=\"no-pointer-events display-5 col-4\">\n                                        {slot.display_name}\n                                    </div>\n                                    <div\n                                        class=\"no-pointer-events col-8 h6 my-0 d-flex align-items-center\"\n                                    >\n                                        Choose a Player\n                                    </div>\n                                </div>\n                            {/if}\n                        {/each}\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<style>\n    td {\n        vertical-align: bottom;\n    }\n    .hidden-border {\n        border: 1px solid white;\n        border-collapse: collapse;\n    }\n    .over {\n        background-color: #f5ee9e;\n    }\n    .highlight {\n        border: 1px dotted black;\n        border-collapse: collapse;\n        border-radius: 5px;\n    }\n    .hide {\n        transform: translateX(-9999px);\n    }\n    .unrosterable {\n        opacity: 0.5;\n    }\n    .pointer {\n        cursor: pointer;\n    }\n    .sorter:after,\n    .sorter:before {\n        position: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: 0.3;\n        height: 100%;\n    }\n    .sorter:after {\n        right: 0.5em;\n        content: \"↓\";\n    }\n    .sorter:before {\n        right: 1em;\n        content: \"↑\";\n    }\n    .sorter {\n        padding-right: 30px;\n        position: relative;\n    }\n    .sorter.sort-asc:before {\n        opacity: 1 !important;\n    }\n    .sorter.sort-desc:after {\n        opacity: 1 !important;\n    }\n    .draggable {\n        cursor: grab;\n    }\n    .roster-holder {\n        position: sticky;\n        top: 65px;\n    }\n    .roster-slot {\n        max-height: 75px;\n    }\n    .padding-r-30 {\n        padding-right: 30px;\n    }\n    .invisible_div {\n        width: -webkit-fill-available;\n        height: 55px;\n        background: rgba(255, 0, 0, 0);\n        margin-top: -50px;\n        z-index: 1;\n        position: absolute;\n    }\n    .no-pointer-events {\n        pointer-events: none;\n    }\n</style>\n","<script>\n    export let schedule;\n    export let weeks;\n    let selectedWeek;\n    let selectedWeeksDays;\n    let selectedDays = [];\n    \n    export let currWeek = 0;\n    function updateDOWArray(index){\n        selectedWeek = weeks[index];\n        selectedWeeksDays = weeks[index].days;\n        selectedDays = [];\n        schedule = schedule;\n    }\n    function teamGamesOnSelectedWeek(teamGames){\n        let startDate = new Date(selectedWeek.start);\n        let endDate = new Date(selectedWeek.trueEnd);\n        let ret_val = teamGames.filter(game => \n        {\n            let gameDate = new Date(game.date);\n            return startDate <= gameDate && gameDate <= endDate;\n        });\n        return ret_val;\n    }\n    function gamesOnSelectedDays(team) {\n        var gameDays = [];\n        let weeksGames = teamGamesOnSelectedWeek(schedule[team]);\n        for (var game of weeksGames) {\n            gameDays.push(game.date);\n        }\n        for (var day of selectedDays) {\n            if (!gameDays.includes(day)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    function buildTableRow(team) {\n        let tableRow = `<tr><td>${team}</td>`;\n        let weeksGames = teamGamesOnSelectedWeek(schedule[team]);\n        for (var day of selectedWeeksDays) {\n            var tableData = \"<td></td>\";\n            for (var game of weeksGames) {\n                if(game.date == day.date){\n                    let atSymbol = game.home ? '@' : '';\n                    tableData = `<td>${atSymbol}${game.opp}</td>`;\n                    break;\n                }\n            }\n            tableRow += tableData;\n        }\n        return tableRow+\"</tr>\";\n    }\n    function toShortDate(dateString){\n        let date = new Date(dateString.replace(/-/g, '\\/'));\n        return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric'});\n    }\n    updateDOWArray(currWeek);\n</script>\n<div>\n    <div class=\"h4 fw-bold\">Select Fantasy Week</div>\n    <div class=\"btn-group\">\n        <div class=\"row\">\n        {#each weeks as week, index}\n        <input id=\"option-{index}\" class=\"btn-check\" type=radio on:change={() => updateDOWArray(index)} bind:group={selectedWeeksDays} value={week.days}>\n        <label for=\"option-{index}\" class=\"col-4 btn btn-outline-primary\">W{index+1}: {toShortDate(week.start)} - {toShortDate(week.end)} </label>\n        {/each}\n        </div>\n    </div>\n    <div class=\"h4 fw-bold\">Show Teams Playing On</div>\n    <div class=\"btn-group flex-wrap\">\n    {#each selectedWeek.days as swd, index}\n    <input id=\"btn-check-{index}\" autocomplete=\"off\" class=\"btn-check\" type=checkbox bind:group={selectedDays} value={swd.date} on:change={()=>{schedule=schedule}}>\n    <label class=\"btn btn-outline-primary\" for=\"btn-check-{index}\">{swd.buttonName}</label>  \n    {/each}\n    </div>\n    <div class=\"table-responsive card my-3 shadow\" style=\"border-radius: 10px;\">\n        <table class=\"table overflow-hidden table-light table-hover table-bordered text-center\" style=\"margin-bottom: 0px;\">\n            <thead class=\"table-dark\"><tr><th>Team</th>\n                {#each selectedWeeksDays as swd}\n                <th>{swd.buttonName}</th>\n                {/each}\n                </tr>\n            </thead>\n            <tbody>\n                {#each Object.entries(schedule) as [team_name, team_sched]}\n                {#if gamesOnSelectedDays(team_name)}\n                {@html buildTableRow(team_name)}\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>","<script>\n    export let player_image;\n    export let player_positions;\n    export let player_name;\n    export let player_inj_tag = \"H\";\n    export let detail_string = \"\";\n</script>\n<style>\n    .shop-pill {\n        display: inline-block;\n        font-size: .65rem;\n        line-height: 1.2;\n        padding: .1rem .4rem;\n        border-radius: 1rem;\n        border: 1px solid #b6d4fe;\n        background: #eaf2ff;\n        color: #0a58ca;\n        vertical-align: middle;\n        white-space: nowrap;\n        opacity: .85;\n    }\n    :global(tr:hover) .shop-pill { opacity: 1; background: #0d6efd; color: #fff; border-color: #0d6efd; }\n</style>\n<div class=\"d-flex\">\n    <img class=\"d-none d-sm-block mt-auto\" style=\"object-fit: contain;\" alt=\"{player_name}\" loading=\"lazy\" height=\"65\" width=\"89\" src=\"{player_image}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\">\n    <span class=\"d-block d-sm-none text-primary fw-normal\">{player_name}</span>\n    <div class=\"lead d-flex flex-column\">\n        <span class=\"d-none d-sm-block\"><span class=\"px-1 border bg-light\">{player_positions}</span> <span class=\"text-primary fw-normal\">{player_name}</span> <span class=\"shop-pill\" title=\"Compare every sportsbook's line for this player\">🛒 Shop lines</span></span>\n        <span class=\"d-none d-sm-block\">{@html detail_string}\n            {#if player_inj_tag == \"O\"}\n            <span class=\"badge bg-danger\">OUT</span>\n            {:else if player_inj_tag == \"Q\" || player_inj_tag == \"D\" || player_inj_tag == \"GTD\"}\n            <span class=\"badge bg-warning\">{player_inj_tag}</span>\n            {/if}\n        </span>\n    </div>\n</div>","<script>\n    export let logo_url = \"\";\n    export let league = \"\";\n</script>\n<div class=\"py-3 overflow-hidden\">\n    <div class=\"px-4 py-5 my-3 text-center animate__animated animate__jackInTheBox\">\n        <img height=\"188\" width=\"200\" class=\"d-block mx-auto img-fluid\" src=\"{logo_url}\" alt=\"DFStud's cartoon horse mascot Studly\"\n            style=\"max-width: 200px;\">\n        <div class=\"col-lg-6 mx-auto p-3 modern-card card\">\n            <h1 class=\"display-5 fw-bold\">Check Back Later for {league.toUpperCase()} Projections!</h1>\n            <p class=\"lead mb-3\">DFStud's {league.toUpperCase()} Projections will be available soon! In the meantime try checking out some other Sports!!</p>\n            <div class=\"d-grid gap-2 d-sm-flex justify-content-sm-center\">\n                {#if league.toUpperCase() == \"NBA\"}\n                <a href=\"/nfl/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏈 NFL</a>\n                <a href=\"/mlb/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize ⚾ MLB</a>\n                {:else if league.toUpperCase() == \"MLB\"}\n                <a href=\"/nfl/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏈 NFL</a>\n                <a href=\"/nba/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize 🏀 NBA</a>\n                {:else if league.toUpperCase() == \"NFL\"}\n                <a href=\"/nba/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏀 NBA</a>\n                <a href=\"/mlb/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize ⚾ MLB</a>\n                {:else if league.toUpperCase() == \"NHL\"}\n                <a href=\"/nba/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏀 NBA</a>\n                <a href=\"/nfl/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize 🏈 NFL</a>\n                {/if}\n            </div>\n        </div>\n    </div>\n</div>","<script>\n\timport PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n\texport let player_stats;\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n\tlet selectedTeam = \"all\";\n\tlet pos_filter = \"all\";\n\tlet position_filters = [\"QB\", \"RB\",\"WR\",\"TE\"];\n\tlet modal_player;\n    let modal_projection_id;\n\tlet playerSearchString = \"\";\n\tlet teams = getTeams(games);\n\tlet mobile = window.innerWidth < 768;\n\tlet teamGameStrings = gameStrings(games);\n\tlet sortableCols = {name:0, pass_yards:0, pass_tds:0, rush_yards:0, rush_tds:0, rec_yards:0, rec_tds:0, fp:0, dk_fp:0, anytime_tds:0, completions:0, carries:0, receptions:0};\n\tlet sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function checkMobile() {\n\t\tif(window.innerWidth < 768) {\n\t\t\tmobile = true;\n\t\t} else {\n\t\t\tmobile = false;\n\t\t}\n\t}\n\twindow.onresize = checkMobile;\n\tfunction setPosFilter(pos){\n\t\tpos_filter = pos;\n\t\tplayer_stats=player_stats;\n\t}\n\tfunction showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(key == \"val\"){\n\t\t\tsortByValue(toggle);\n\t\t\treturn;\n\t\t}\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'nfl'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time} lines={game.lines}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n\t<div class=\"row\">\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} on:change=\"{()=>{player_stats=player_stats}}\" class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n\t\t\t\t<input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} value=\"all\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\">\n\t\t\t\t<label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">All</label>\n\t\t\t\t{#each position_filters as position, index}\n\t\t\t\t<input type=\"radio\" on:click={()=>setPosFilter(position)} class=\"btn-check\" name=\"btnradio\" id=\"btnradio{index+2}\" autocomplete=\"off\">\n\t\t\t\t<label class=\"w-100 btn btn-outline-primary\" for=\"btnradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} on:keyup={()=>{setTimeout(player_stats=player_stats,500)}} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n\t<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n\t\t\t\t<tr class=\"ps-2\">\n\t\t\t\t\t<th class=\"sticky-col sticky-shadow-right\" style=\"border-bottom: 0px !important;\"></th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Passing</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Rushing</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Receiving</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center\" style=\"border-bottom: 0px !important;\"></th>\n\t\t\t\t</tr>\n                <tr class=\"ps-2\">\n                    <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"completions\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"completions\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Com / Att</th>\n                    <th class=\"{sortClasses[sortableCols[\"pass_yards\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"pass_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Pass Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"pass_tds\"]+1]} padding-r-30 text-center  sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"pass_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Pass TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"carries\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"carries\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Carries</th>\n                    <th class=\"{sortClasses[sortableCols[\"rush_yards\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rush_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rush Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"rush_tds\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"rush_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rush TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"receptions\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"receptions\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec / Tgt</th>\n                    <th class=\"{sortClasses[sortableCols[\"rec_yards\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rec_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"rec_tds\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"rec_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"anytime_tds\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"anytime_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>TDs</th>\n                    <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                    <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each player_stats as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.completions} / {ps.stats.attempts}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.pass_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.pass_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.carries}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rush_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.rush_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.receptions} / {ps.stats.targets}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rec_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.rec_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.anytime_tds}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>\n{:else}\n<NoProj league={\"NFL\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n\texport let player_stats;\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let mobile = window.innerWidth < 768;\n    function checkMobile() {\n\t\tif(window.innerWidth < 768) {\n\t\t\tmobile = true;\n\t\t} else {\n\t\t\tmobile = false;\n\t\t}\n\t}\n\twindow.onresize = checkMobile;\n    let playerSearchString = \"\";\n    let selectedTeam = \"all\";\n    let pos_filter = \"all\";\n    let teams = getTeams(games);\n    let position_filters = [\"PG\", \"SG\", \"SF\", \"PF\", \"C\"];\n    let teamGameStrings = gameStrings(games);\n    let sortableCols = {name:0, min:0, points:0, rebounds:0, assists:0, blocks:0, steals:0, turnovers:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(key == \"val\"){\n\t\t\tsortByValue(toggle);\n\t\t\treturn;\n\t\t}\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time} lines={game.lines}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} on:change=\"{()=>{player_stats=player_stats}}\" class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n            <input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} value=\"all\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">All</label>\n            {#each position_filters as position, index}\n            <input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} class=\"btn-check\" name=\"btnradio\" id=\"btnradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} on:keyup={()=>{setTimeout(player_stats=player_stats,500)}} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[sortableCols[\"min\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"min\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Min</th>\n                    <th class=\"{sortClasses[sortableCols[\"points\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"points\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Points</th>\n                    <th class=\"{sortClasses[sortableCols[\"rebounds\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rebounds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rebounds</th>\n                    <th class=\"{sortClasses[sortableCols[\"assists\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"assists\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Assists</th>\n                    <th class=\"{sortClasses[sortableCols[\"blocks\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"blocks\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Blocks</th>\n                    <th class=\"{sortClasses[sortableCols[\"steals\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"steals\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Steals</th>\n                    <th class=\"{sortClasses[sortableCols[\"turnovers\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"turnovers\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Turnovers</th>\n                    <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                    <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each player_stats as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.min}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rebounds}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.assists}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.blocks}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.steals}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.turnovers}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>\n{:else}\n<NoProj league={\"NBA\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","<script>\n    // Import Swiper Svelte components\n    import { Navigation, Pagination, Scrollbar, A11y, Autoplay } from \"swiper\";\n    import { Swiper, SwiperSlide } from \"swiper/svelte/swiper-svelte.js\";\n    import \"swiper/swiper-bundle.min.css\";\n    // swiper core styles\n    import \"swiper/swiper.min.css\";\n    import { onMount } from \"svelte\";\n    // modules styles\n    import \"swiper/modules/navigation/navigation.min.css\";\n    import \"swiper/modules/pagination/pagination.min.css\";\n    let mobile = window.innerWidth < 768;\n</script>\n\n<div>\n    <Swiper\n        effect={\"coverflow\"}\n        grabCursor={true}\n        centeredSlides={true}\n        slidesPerView=\"1\"\n        autoplay={{\n            delay: 100000,\n            disableOnInteraction: false,\n        }}\n        loop={true}\n        loopFillGroupWithBlank={true}\n        pagination={{\n            clickable: true,\n        }}\n        navigation={true}\n        modules={[Autoplay, Pagination, Navigation]}\n        class=\"mySwiper\"\n    >\n        <SwiperSlide>\n            <a href=\"/nba/projections\" class=\"text-decoration-none\">\n                <div class=\"bg-white mb-4 h-100 px-5\">\n                    <h5 class=\"card-title\">Projections</h5>\n                    <p class=\"card-text text-dark\">\n                        This is a wider card with supporting text below as a\n                        natural lead-in to additional content. This content\n                        is a little bit longer.\n                    </p>\n                </div>\n            </a>\n        </SwiperSlide>\n        <SwiperSlide>\n            <a href=\"/nba/fantasy/daily/optimizer\" class=\"text-decoration-none\">\n                <div class=\"bg-white mb-4 h-100 px-5\">\n                    <h5 class=\"card-title\">Optimizer</h5>\n                    <p class=\"card-text text-dark\">\n                        This is a wider card with supporting text below as a\n                        natural lead-in to additional content. This content\n                        is a little bit longer.This is a wider card with supporting text below as a natural\n                        lead-in to\n                        additional content. This content is a little bit longer.\n                        This is a wider card with supporting text below as a natural lead-in to\n                        additional content. This content is a little bit longer.\n                    </p>\n                </div>\n            </a>\n        </SwiperSlide>\n    </Swiper>\n</div>\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n\texport let batters = [];\n\texport let player_search = \"\";\n\texport let selected_team = \"\";\n\texport let pos_filter = \"\";\n    export let showPlayerModal;\n    export let game_strings = [];\n    let sortableCols = {name:0, singles:0, doubles:0, triples:0, homeruns:0, runs:0, rbis:0, stolen_bases:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n\tfunction filterPlayer(batter, name_search, team_search, pos_search){\n\t\treturn batter.name.toLowerCase().includes(name_search.toLowerCase()) && (team_search == \"all\" || batter.team == team_search) && (pos_search == \"all\" || batter.positions.includes(pos_search));\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n    <table class=\"table\">\n        <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n            <tr class=\"ps-2\">\n                <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                <th class=\"{sortClasses[sortableCols[\"singles\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"singles\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Singles</th>\n                <th class=\"{sortClasses[sortableCols[\"doubles\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"doubles\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Doubles</th>\n                <th class=\"{sortClasses[sortableCols[\"triples\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"triples\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Triples</th>\n                <th class=\"{sortClasses[sortableCols[\"homeruns\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"homeruns\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Homeruns</th>\n                <th class=\"{sortClasses[sortableCols[\"runs\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"runs\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Runs</th>\n                <th class=\"{sortClasses[sortableCols[\"rbis\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rbis\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>RBIs</th>\n                <th class=\"{sortClasses[sortableCols[\"stolen_bases\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"stolen_bases\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Stolen Bases</th>\n                <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n        </thead>\n        <tbody>\n            {#each batters as batter}\n                {#if filterPlayer(batter, player_search, selected_team, pos_filter)}\n                <tr>\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(batter)}}>\n                        <PlayerDiv player_image={batter.img_thumb} player_positions={batter.positions} player_name={batter.name} detail_string={game_strings[batter.team]} player_inj_tag={batter.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.singles}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.doubles}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.triples}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.homeruns}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.runs}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.rbis}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.stolen_bases}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.dk_fp}</td>\n                </tr>\n                {/if}\n            {/each}\n        </tbody>\n    </table>\n</div>\n\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n\texport let pitchers = [];\n\texport let player_search = \"\";\n\texport let selected_team = \"\";\n    export let showPlayerModal;\n    export let game_strings = [];\n    let sortableCols = {name:0, earned_runs:0, innings_pitched:0, strikeouts:0, wins:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n\tfunction filterPlayer(pitcher, name_search, team_search){\n\t\treturn pitcher.name.toLowerCase().includes(name_search.toLowerCase()) && (team_search == \"all\" || pitcher.team == team_search);\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n    <table class=\"table\">\n        <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n            <tr class=\"ps-2\">\n                <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                <th class=\"{sortClasses[sortableCols[\"earned_runs\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"earned_runs\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Earned Runs</th>\n                <th class=\"{sortClasses[sortableCols[\"innings_pitched\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"innings_pitched\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Innings Pitched</th>\n                <th class=\"{sortClasses[sortableCols[\"strikeouts\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"strikeouts\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Strikeouts</th>\n                <th class=\"{sortClasses[sortableCols[\"wins\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"wins\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Wins</th>\n                <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n        </thead>\n        <tbody>\n            {#each pitchers as pitcher}\n                {#if filterPlayer(pitcher, player_search, selected_team)}\n                <tr>\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(pitcher)}}>\n                        <PlayerDiv player_image={pitcher.img_thumb} player_positions={pitcher.positions} player_name={pitcher.name} detail_string={game_strings[pitcher.team]} player_inj_tag={pitcher.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.earned_runs}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.innings_pitched}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.strikeouts}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.wins}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.dk_fp}</td>\n                </tr>\n                {/if}\n            {/each}\n        </tbody>\n    </table>\n</div>\n\n","<script>\n    import PlayerModal from './PlayerModal.svelte';\n    import BatterTable from \"./BatterTable.svelte\";\n    import PitcherTable from \"./PitcherTable.svelte\";\n    import NoProj from './NoProj.svelte';\n    import { onMount } from 'svelte';\n    import { getTeams, gameStrings } from './filter_utils.js';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    export let games = [];\n    export let players = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let teams = [];\n    let pos_filter = \"all\";\n    let pitching_batting_select = \"pitching\";\n    let position_filters = [\"C\", \"1B\" ,\"2B\", \"3B\", \"SS\", \"OF\"];\n    let selected_team = \"all\";\n    let batters = [];\n    let pitchers = [];\n    let player_search = \"\";\n    let game_strings = gameStrings(games);\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    onMount(() => {\n\t\t// split players into batters and pitchers\n        for (let player of players) {\n            if (player.positions.includes(\"P\")) {\n                pitchers.push(player);\n            } else {\n                batters.push(player);\n            }\n        }\n        // add teams in the games\n        teams = getTeams(games);\n        pitchers = pitchers;\n        batters = batters;\n\t});\n</script>\n{#if games.length > 0 && players.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'mlb'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{true}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time} lines={game.lines}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-12\">\n            <div\n                class=\"d-flex h-100 align-items-center btn-group\"\n                role=\"group\"\n                aria-label=\"Basic radio toggle button group\"\n            >\n                <input\n                    type=\"radio\"\n                    bind:group={pitching_batting_select}\n                    value=\"pitching\"\n                    class=\"btn-check\"\n                    name=\"btnradio\"\n                    id=\"btnradio1\"\n                    autocomplete=\"off\"\n\t\t\t\t\tchecked\n                />\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">Pitching</label>\n                <input\n                    type=\"radio\"\n                    bind:group={pitching_batting_select}\n                    class=\"btn-check\"\n                    name=\"btnradio\"\n                    id=\"btnradio2\"\n                    value={\"batting\"}\n                    autocomplete=\"off\"\n                />\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio2\">Batting</label>\n            </div>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'col-md-6' : 'col-lg-4'} pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selected_team}  class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'd-none' : 'col-lg-4'} pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n            <input type=\"radio\" bind:group={pos_filter} value=\"all\" class=\"btn-check\" name=\"pos-radio\" id=\"posradio1\" autocomplete=\"off\" checked>\n            <label class=\"w-100 btn btn-outline-primary\" for=\"posradio1\">All</label>\n            {#each position_filters as position, index}\n            <input type=\"radio\" bind:group={pos_filter} class=\"btn-check\" name=\"pos-radio\" id=\"posradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"posradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'col-md-6' : 'col-lg-4'} pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={player_search} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    {#if pitching_batting_select == \"pitching\"}\n        <PitcherTable pitchers={pitchers} player_search={player_search} selected_team={selected_team} game_strings={game_strings} showPlayerModal={showPlayerModal}/>\n    {:else}\n        <BatterTable batters={batters} player_search={player_search} selected_team={selected_team} pos_filter={pos_filter} game_strings={game_strings} showPlayerModal={showPlayerModal}/>\n    {/if}\n</div>\n{:else}\n<NoProj league={\"MLB\"} logo_url={window.logo_url}></NoProj>\n{/if}","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n    export let players = [];\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let mobile = window.innerWidth < 768;\n    function checkMobile() {\n\t\tmobile = window.innerWidth < 768;\n\t}\n\twindow.onresize = checkMobile;\n    let playerSearchString = \"\";\n    let selectedTeam = \"all\";\n    let pos_filter = \"all\";\n    let skater_goalie_select = \"skaters\";\n    let teams = getTeams(games);\n    let position_filters = [\"C\", \"W\", \"D\"];\n    let teamGameStrings = gameStrings(games);\n    // Skaters and goalies project different stats, so they get their own tables\n    let skaters = players.filter(p => !p.positions.includes(\"G\"));\n    let goalies = players.filter(p => p.positions.includes(\"G\"));\n    let skaterCols = {name:0, toi:0, goals:0, assists:0, points:0, shots:0, blocked_shots:0, power_play_points:0, fp:0, dk_fp:0};\n    let goalieCols = {name:0, wins:0, saves:0, shots_against:0, goals_against:0, shutouts:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, list, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        if(key != \"name\" && list.length && list[0].stats){\n            list.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            list.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:list, sortableCols:sortableCols};\n\t}\n    function sortSkaters(key) {\n        let r = sortByX(key, skaterCols, skaters);\n        skaters = r.players;\n        skaterCols = r.sortableCols;\n    }\n    function sortGoalies(key) {\n        let r = sortByX(key, goalieCols, goalies);\n        goalies = r.players;\n        goalieCols = r.sortableCols;\n    }\n    function pct(v) {\n        return Math.round(v * 100) + \"%\";\n    }\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0 && players.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'nhl'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: { slidesPerView: 1, spaceBetween: 10 },\n\t\t\t768: { slidesPerView: 2, spaceBetween: 10 },\n\t\t\t1024: { slidesPerView: 3, spaceBetween: 10 },\n\t\t\t1280: { slidesPerView: 4, spaceBetween: 10 },\n\t\t\t1920: { slidesPerView: 5, spaceBetween: 10 }\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time} lines={game.lines}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-12\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Skaters or goalies\">\n                <input type=\"radio\" bind:group={skater_goalie_select} value=\"skaters\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\" checked>\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">Skaters</label>\n                <input type=\"radio\" bind:group={skater_goalie_select} value=\"goalies\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio2\" autocomplete=\"off\">\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio2\">Goalies</label>\n            </div>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'col-md-6'} pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'd-none'} pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Position filter\">\n                <input type=\"radio\" bind:group={pos_filter} value=\"all\" class=\"btn-check\" name=\"pos-radio\" id=\"posradio1\" autocomplete=\"off\" checked>\n                <label class=\"w-100 btn btn-outline-primary\" for=\"posradio1\">All</label>\n                {#each position_filters as position, index}\n                <input type=\"radio\" bind:group={pos_filter} class=\"btn-check\" name=\"pos-radio\" id=\"posradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n                <label class=\"w-100 btn btn-outline-primary\" for=\"posradio{index+2}\">{position}</label>\n                {/each}\n            </div>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'col-md-6'} pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Search for a player\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    {#if skater_goalie_select == \"skaters\"}\n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>sortSkaters(\"name\")} class=\"sticky-col sticky-shadow-right {sortClasses[skaterCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[skaterCols[\"toi\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"toi\")}>TOI</th>\n                    <th class=\"{sortClasses[skaterCols[\"goals\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"goals\")}>Goals</th>\n                    <th class=\"{sortClasses[skaterCols[\"assists\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"assists\")}>Assists</th>\n                    <th class=\"{sortClasses[skaterCols[\"points\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortSkaters(\"points\")}>Points</th>\n                    <th class=\"{sortClasses[skaterCols[\"shots\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"shots\")}>SOG</th>\n                    <th class=\"{sortClasses[skaterCols[\"blocked_shots\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"blocked_shots\")}>Blocks</th>\n                    <th class=\"{sortClasses[skaterCols[\"power_play_points\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortSkaters(\"power_play_points\")}>PP Pts</th>\n                    <th class=\"{sortClasses[skaterCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortSkaters(\"fp\")}>FD FP</th>\n                    <th class=\"{sortClasses[skaterCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortSkaters(\"dk_fp\")}>DK FP</th>\n                </tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each skaters as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.toi.toFixed(1)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.goals}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.assists}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.shots}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.blocked_shots}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.power_play_points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n    {:else}\n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>sortGoalies(\"name\")} class=\"sticky-col sticky-shadow-right {sortClasses[goalieCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[goalieCols[\"wins\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"wins\")}>Win %</th>\n                    <th class=\"{sortClasses[goalieCols[\"saves\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"saves\")}>Saves</th>\n                    <th class=\"{sortClasses[goalieCols[\"shots_against\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"shots_against\")}>Shots Against</th>\n                    <th class=\"{sortClasses[goalieCols[\"goals_against\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"goals_against\")}>Goals Against</th>\n                    <th class=\"{sortClasses[goalieCols[\"shutouts\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortGoalies(\"shutouts\")}>Shutout %</th>\n                    <th class=\"{sortClasses[goalieCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortGoalies(\"fp\")}>FD FP</th>\n                    <th class=\"{sortClasses[goalieCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortGoalies(\"dk_fp\")}>DK FP</th>\n                </tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each goalies as ps}\n                {#if searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pct(ps.stats.wins)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.saves}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.shots_against}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.goals_against}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{pct(ps.stats.shutouts)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n    {/if}\n</div>\n{:else}\n<NoProj league={\"NHL\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","import Optimizer from './Optimizer.svelte';\nimport NbaSchedule from './NbaSchedule.svelte';\nimport NflProj from './NflProj.svelte';\nimport NbaProj from './NbaProj.svelte';\nimport DailySwiper from './DailySwiper.svelte';\nimport MlbProj from './MlbProj.svelte';\nimport NhlProj from './NhlProj.svelte';\nwindow.Optimizer = function (options) {\n    return new Optimizer(options);\n};\nwindow.NbaSchedule = function (options) {\n    return new NbaSchedule(options);\n};\nwindow.NflProj = function (options) {\n    return new NflProj(options);\n};\nwindow.NbaProj = function (options) {\n    return new NbaProj(options);\n};\nwindow.DailySwiper = function (options) {\n    return new DailySwiper(options);\n};\nwindow.MlbProj = function (options) {\n    return new MlbProj(options);\n};\nwindow.NhlProj = function (options) {\n    return new NhlProj(options);\n};\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","current_component","src_url_equal","element_src","url","document","createElement","href","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","slice","get_slot_changes","dirty","lets","undefined","merged","len","Math","max","length","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","p","get_all_dirty_from_scope","exclude_internal_props","props","result","compute_rest_props","keys","rest","Set","has","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","d","element","name","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","prevent_default","preventDefault","call","this","attr","attribute","value","removeAttribute","getAttribute","setAttribute","set_attributes","attributes","descriptors","getOwnPropertyDescriptors","__proto__","key","style","cssText","set","to_number","set_data","wholeText","set_input_value","input","set_style","important","setProperty","select_option","select","option","__value","selected","selectedIndex","select_options","indexOf","select_value","selected_option","querySelector","toggle_class","toggle","classList","HtmlTag","[object Object]","e","n","html","h","nodeName","t","c","innerHTML","Array","from","childNodes","set_current_component","component","get_current_component","Error","onMount","$$","on_mount","push","afterUpdate","after_update","onDestroy","on_destroy","createEventDispatcher","type","detail","callbacks","bubbles","createEvent","initCustomEvent","custom_event","bubble","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","schedule_update","then","flush","add_render_callback","flushing","seen_callbacks","update","pop","callback","add","clear","fragment","before_update","outroing","outros","group_outros","r","check_outros","transition_in","block","local","delete","transition_out","o","globals","window","globalThis","global","get_spread_update","levels","updates","to_null_out","accounted_for","create_component","mount_component","customElement","m","new_on_destroy","map","filter","destroy_component","init","instance","create_fragment","not_equal","append_styles","parent_component","bound","on_disconnect","context","Map","skip_bound","root","ready","ret","fill","make_dirty","hydrate","nodes","children","l","intro","SvelteComponent","$destroy","index","splice","$$props","obj","$$set","isObject","constructor","extend","ssrDocument","body","activeElement","querySelectorAll","getElementById","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","origin","pathname","protocol","search","getDocument","doc","ssrWindow","navigator","userAgent","history","CustomEvent","getComputedStyle","getPropertyValue","screen","matchMedia","requestAnimationFrame","setTimeout","id","clearTimeout","getWindow","win","Dom7","items","super","proto","defineProperty","get","makeReactive","arrayFlat","arr","res","el","isArray","arrayFilter","prototype","$","selector","trim","toCreate","tempParent","qsa","nodeType","uniqueArray","arrayUnique","Methods","addClass","classes","classNames","split","removeClass","remove","hasClass","className","contains","toggleClass","attrs","arguments","attrName","removeAttr","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","is","apply","parents","handleEvent","events","j","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","dom7proxy","trigger","evt","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","prop","each","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","els","newChild","tempDiv","firstChild","prepend","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","closest","find","foundElements","found","nextTick","delay","now","Date","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","time","startTime","params","speed","wrapperEl","scrollSnapType","cancelAnimationFrame","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","deviceCached","browser","getSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","calcSupport","getDevice","overrides","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","os","calcDevice","getBrowser","isSafari","toLowerCase","isWebView","test","calcBrowser","methodName","writable","priority","self","method","eventsListeners","onceHandler","__emitterProxy","eventsAnyListeners","eventHandler","transitionEmit","runCallbacks","direction","step","activeIndex","previousIndex","emit","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","closestElement","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","blur","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtlTranslate","rtl","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","stopPropagation","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","currentPos","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","newProgress","previousTranslate","translatesDiff","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","passiveListeners","passive","move","end","cancel","updateOnWindowResize","isGridEnabled","grid","rows","initialSlide","resizeObserver","createElements","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","$el","clientWidth","clientHeight","parseInt","Number","isNaN","size","getDirectionLabel","property","margin-top","margin-bottom ","margin-left","margin-right","padding-left","padding-right","marginRight","getDirectionPropertyValue","label","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","gridEnabled","slideSize","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","ceil","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","originalSlideProgress","slideBefore","slideAfter","originalProgress","multiplier","wasBeginning","wasEnd","realIndex","activeSlide","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","x","y","translateTo","translateBounds","internal","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionStart","initial","indexAsNumber","isFinite","normalizedTranslate","normalizedGrid","normalizedGridNext","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","$selector","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","bind","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","resultClasses","item","prepareClasses","pointer-events","free-mode","autoheight","grid-column","css-mode","centered","removeClasses","images","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","Image","onload","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","extendParams","once","swiperParams","defaults","passedParams","eventName","onAny","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","cls","slideEl","getSlideClasses","view","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","mounted","getWrapperSelector","getWrapper","wrapper","mount","deleteInstance","cleanStyles","object","deleteProps","newDefaults","module","installModule","createElementIfNotDefined","checkProps","Navigation","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","destroy","hideOnClick","hiddenClass","_s","targetEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","position","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","offsetProp","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","Scrollbar","dragStartPos","dragSize","trackSize","divider","timeout","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","returnValue","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","keyCode","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","addElControls","$containerEl","repeat","round","random","getRandomNumber","live","addElLive","$slideEl","bulletEl","updatePagination","Autoplay","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","stop","pause","waitForTransition","onTransitionEnd","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","needsNavigation","needsPagination","needsScrollbar","uniqueClasses","unique","prototypeGroup","protoMethod","use","observer","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","paramsList","updateSwiper","changedParams","scrollbarEl","paginationEl","updateParams","currentParams","thumbs","needThumbsInit","needControllerInit","needPaginationInit","needScrollbarInit","needNavigationInit","includes","controller","control","newValue","dispatch","paramsData","restProps","containerClasses","breakpointChanged","swiperInstance","oldPassedParams","swiperEl","virtualData","setVirtualData","onSwiper","lazy","load","calcParams","allowedParams","getParams","$$restProps","_beforeBreakpoint","_swiper","initSwiper","extendWith","cache","renderExternal","renderExternalUpdate","mountSwiper","oldParams","addKey","newKeys","oldKeys","newKey","oldKey","getChangedParams","zoom","virtualIndex","slideClasses","eventAttached","updateClasses","attachEvent","slideData","isActive","isVisible","isDuplicate","isPrev","isNext","searchFilter","player","searchString","positionFilter","pos_filter","positions","getTeams","games","teams","game","home_team","away_team","short_name","localeCompare","filterByTeam","playerTeam","selectedTeam","gameStrings","link","odds","book","logo","books","game_time","lines","kind","entry_id","changed","salary","toLocaleString","proj","inj_tag","locked","img_thumb","fantasy_points","lineup","lineup_details","player_name","player_image","projection","included","rosterPlayer","excludePlayer","includePlayer","rosterable","game_details","showPlayerModal","exports","_2PI","mean","std","u1","u2","log","generateGaussian","require$$0","erfc","z","exp","Gaussian","variance","standardDeviation","pdf","pow","cdf","ppf","xx","err","ierfc","mul","precision","dprecision","fromPrecisionMean","div","gaussian","sub","num","precisionmean","requestAnimFrame","throttled","thisArg","updateFn","updateArgs","ticking","_toLeftRightCenter","align","_alignStartEnd","uid","isNullOrUndef","isNumberFinite","finiteOrDefault","defaultValue","valueOrDefault","toDimension","dimension","endsWith","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","clone$1","source","klen","isValidKey","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","indexOfDotOrLength","idx","resolveObjectKey","pos","_capitalize","str","charAt","toUpperCase","defined","isFunction","setsEqual","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","niceNum","range","roundedRange","almostEquals","niceRange","fraction","isNumber","epsilon","_setMinAndMaxByKey","array","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","s","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInBounce","easeOutBounce","easeInOutBounce","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","f","hex","h1","h2","hexString","g","isShort","lim","p2b","n2b","b2n","n2p","RGB_RE","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","calln","hsl2rgb","hue","hueParse","exec","p1","p2","hwb2rgb","hsv2rgb","map$1","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","names$1","nameParse","unpacked","tkeys","ok","nk","unpack","transparent","modHSL","tmp","clone","fromObject","functionParse","rgbParse","Color","_rgb","_valid","valid","hslString","color","weight","me","c1","c2","w2","w1","deg","rotate","index_esm","isPatternOrGradient","CanvasGradient","CanvasPattern","getHoverColor","saturate","darken","getScope$1","scope","values","_descriptors","animation","backgroundColor","borderColor","datasets","devicePixelRatio","chart","getDevicePixelRatio","elements","font","family","lineHeight","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","maintainAspectRatio","onHover","parsing","plugins","responsive","scales","showLine","drawActiveElementsOnTop","describe","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","_scriptable","startsWith","_indexable","_fallback","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","garbageCollect","save","jlen","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","drawPoint","xOffset","yOffset","cornerRadius","pointStyle","rotation","radius","rad","drawImage","beginPath","arc","closePath","moveTo","lineTo","SQRT1_2","rect","borderWidth","stroke","_isPointInArea","area","margin","right","bottom","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","strokeWidth","strokeColor","line","translation","fillStyle","textAlign","textBaseline","setRenderOpts","strokeStyle","lineWidth","strokeText","maxWidth","fillText","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","RegExp","FONT_STYLE","toLineHeight","_readValueToProps","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","toFontString","inputs","info","cacheable","createContext","parentContext","_lookup","table","cmp","mid","hi","lo","_lookupByKey","_rlookupByKey","arrayEvents","unlistenArrayEvents","stub","_chartjs","listeners","_arrayUnique","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","override","Proxy","deleteProperty","_keys","_cached","proxy","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","isScriptable","_resolveScriptable","isIndexable","resolver","_resolveArray","_resolveWithContext","allKeys","configurable","scriptable","indexable","_allKeys","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","delta","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","spanGaps","cubicInterpolationMode","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getPositionedStyle","getRelativePosition","borderBox","paddings","borders","native","offsetX","offsetY","useOffsetPos","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxHeight","containerSize","container","containerStyle","containerBorder","containerPadding","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","readUsedSize","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","formatNumber","locale","cacheKey","JSON","stringify","formatter","Intl","NumberFormat","getNumberFormat","format","getRtlAdapter","rectX","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","original","getPropertyPriority","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalizeSegment","count","_boundSegment","segment","bounds","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","animator","_request","_charts","_running","_lastDate","anims","date","numSteps","currentStep","_update","_refresh","remaining","draw","_active","_total","tick","_notify","charts","cb","_getAnims","reduce","acc","cur","_duration","interpolators","boolean","factor","c0","mix","Animation","cfg","currentValue","_fn","_easing","easing","_start","_loop","_target","_prop","_from","_to","_promises","elapsed","remain","promises","rej","resolved","animationOptions","colors","properties","numbers","active","resize","show","animations","visible","Animations","config","_properties","configure","animatedProps","getOwnPropertyNames","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","wait","all","awaitAll","_animateOptions","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","isStacked","meta","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","parsed","_cachedMeta","_stacks","iScale","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","getFirstScaleId","shift","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","$context","_syncList","initialize","linkScales","_stacked","addElements","dataset","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","xScale","getScaleForId","yScale","rScale","getDatasetMeta","scaleID","adata","convertObjectDataToArray","isExtensible","_dataCheck","datasetElementType","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","_sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","parse","xAxisKey","yAxisKey","parsedValue","NaN","canStack","otherScale","_getOtherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","minDefined","maxDefined","getUserBounds","_skip","updateRangeFromParsed","getParsed","getLabelForValue","_clip","toClip","defaultClip","getMaxOverflow","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","raw","createDataContext","createDatasetContext","_resolveElementOptions","dataElementType","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","datasetAnimationScopeKeys","sharedOptions","_animationsDisabled","_resolveAnimations","getSharedOptions","_setStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","updateElements","removed","_dataChanges","_sync","newCount","computeMinSampleSize","_cache","$bar","visibleMetas","concat","getAllParsedValues","getAllScaleValues","curr","_length","updateMinAndPrev","getPixelForValue","ticks","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","BarController","iAxisKey","vAxisKey","bars","reset","getBasePixel","ruler","_getRuler","firstOpts","includeOptions","updateSharedOptions","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","updateElement","last","grouped","_getStacks","pixels","barThickness","_startPixel","_endPixel","stackCount","_getStackCount","categoryPercentage","barPercentage","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","halfGrid","getLineWidthForValue","skipNull","maxBarThickness","Infinity","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","_getStackIndex","rects","_index_","_value_","beginAtZero","BubbleController","getPixelForDecimal","tooltip","title","DoughnutController","innerRadius","outerRadius","getter","circumference","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","cutout","chartWeight","_getRingWeight","_getRotationExtents","ratioX","ratioY","startAngle","endAngle","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_circumference","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","legendItem","toggleDataVisibility","tooltipItem","dataLabel","formattedValue","LineController","_dataset","animationsDisabled","pointCount","getStartAndCountOfVisiblePoints","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","scaleRangesChanged","_decimated","animated","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","updateControlPoints","PolarAreaController","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","controllers","abstract","DateAdapter","timestamp","amount","unit","weekday","members","adapters","_date","getRelativePosition$1","binarySearch","metaset","lookupMethod","_reversePixels","getRange","optimizedEvaluateItems","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","_minPadding","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","evaluateAllVisibleItems","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","wrap","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","padding","autoPadding","_layers","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","BasicPlatform","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","createAttachObserver","addedNodes","removedNodes","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","listenDevicePixelRatioChanges","releaseObserver","unlistenDevicePixelRatioChanges","createProxyAndListen","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","proxies","$proxies","isConnected","Element","final","defaultRoutes","formatters","tickValue","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","numeric","Ticks","autoSkip","tickOpts","ticksLimit","maxTicksLimit","tickLength","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","majorIndices","major","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","grace","drawBorder","drawOnChartArea","drawTicks","tickWidth","tickColor","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkipPadding","labelOffset","minor","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","offsetFromEdge","sample","numItems","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getMinMax","xLabels","yLabels","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","beforeFit","fit","afterFit","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetRight","generateTickLabels","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","decimal","getBaseValue","createTickContext","createScaleContext","optionTicks","rot","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","backdrop","labelPadding","fillRect","findIndex","_computeGridLineItems","drawLine","setLineDash","lineDashOffset","lastLineWidth","_computeLabelArea","_computeLabelItems","titleX","titleY","titleArgs","drawBackground","drawGrid","drawTitle","drawLabels","tz","gz","axisID","fontSize","TypedRegistry","isPrototypeOf","parentScope","isIChartComponent","register","itemDefaults","routes","propertyParts","sourceName","sourceScope","parts","routeDefaults","registerDefaults","registry","_typedRegistries","_each","_get","typedRegistry","arg","reg","_getRegistryForType","isForType","_exec","itemReg","camelMethod","PluginService","_init","hook","_createDescriptors","descriptor","plugin","_oldCache","_notifyStateChanges","getPlugin","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","some","pluginScopeKeys","getIndexAxis","datasetDefaults","determineAxis","scaleOptions","initOptions","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","error","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","mergeScaleConfig","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","Chart","userConfig","initialCanvas","existingChart","chartOptionScopes","OffscreenCanvas","_detectPlatform","updateConfig","acquireContext","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newRatio","axisOptions","scaleOpts","updated","isRadial","dposition","dtype","scaleType","getScale","hasUpdated","addBox","_destroyDatasetMeta","newControllers","_removeUnreferencedMetasets","order","updateIndex","ControllerClass","getController","getElement","_updateMetasets","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","removeBox","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","setDatasetVisibility","_updateVisibility","_destroy","_stop","releaseContext","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","isAttached","activeElements","lastActive","replay","hoverOptions","deactivated","activated","updateHoverStyle","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","getElementsAtEventForMode","invalidatePlugins","clipArc","pixelMargin","angleMargin","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","alpha","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","inner","lineJoin","fullCircles","drawFullCircleBorders","version","unregister","ArcElement","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","hoverRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","intermediateIndex1","intermediateIndex2","minMaxDecimation","decodeFill","fillOption","parseFillOption","simpleArc","computeBoundary","computeCircularBoundary","computeLinearBoundary","findSegmentEnd","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","interpolate","pointValue","linePoints","firstValue","lastValue","getLineByIndex","sourcePoints","below","getLinesBelow","createBoundaryLine","buildStackLine","boundary","pointsFromSegments","resolveTarget","propagate","visited","clipY","lineLoop","getBounds","_getEdge","clipBounds","interpolatedLineTo","interpolatedPoint","_fill","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","notShape","targetLoop","drawfill","lineOpts","above","doFill","plugin_filler","_args","$filler","drawTime","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","generateLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","heightLimit","totalWidth","currentColWidth","currentColHeight","col","rtlHelper","hitbox","_draw","defaultColor","fontColor","halfFontSize","textDirection","setWidth","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","_textX","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","onLeave","isListened","hoveredItem","_getLegendItemAt","sameItem","plugin_legend","_element","adjustHitBoxes","ci","Title","_padding","textSize","fontOpts","_drawArgs","plugin_title","titleBlock","createTitle","WeakMap","plugin_subtitle","positioners","hasValue","tooltipPosition","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","getLabelAndValue","getTooltipSize","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","Tooltip","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","tooltipItems","createTooltipContext","beforeTitle","afterTitle","bodyItems","scoped","beforeLabel","afterLabel","beforeFooter","afterFooter","itemSort","labelColor","labelPointStyle","labelTextColor","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","_drawColorBox","footerAlign","footerColor","tooltipSize","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","drawBody","drawFooter","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","labelCount","Decimation","Filler","SubTitle","findOrAddLabel","addedLabels","addIfString","lastIndexOf","CategoryScale","_startValue","_valueRange","_addedLabels","added","getDecimalForPixel","generateTicks$1","generationOptions","dataRange","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","stepSize","computeTickLimit","getTickLimit","_maxDigits","LinearScale","handleTickRangeOptions","isMajor","tickVal","LogarithmicScale","_zero","endExp","endSignificand","significand","lastTick","generateTicks","getTickBackdropHeight","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","updateLimits","setCenterPoint","_pointLabelItems","extra","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","buildPointLabelItems","hLimits","vLimits","pathRadiusLine","logarithmic","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","drawPointLabels","gridLineOpts","drawRadiusLine","angleLines.color","pointLabels.color","ticks.color","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","addTick","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","minorFormat","majorFormat","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","prevSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables","clickHooks","moveHooks","hooks","state","listened","moveListened","getNearestItem","hovered","leave","enter","dispatchMoveEvents","handleMoveEvents","elOpts","dblclick","dblClickSpeed","handleClickEvents","nearestItems","_index","adjustScaleRange","annotations","scaleIDOption","annotation","getScaleLimits","changeScaleLimit","suggestedLimit","scaleLimitDefined","verifyScaleIDs","verifyProperties","clamp","clampAll","inBoxRange","hBorderWidth","getElementCenterPoint","isOlderPart","act","req","isPercentString","toPercent","positionOption","getSize","toPosition","isBoundToPoint","xValue","yValue","widthCache","isImageOrCanvas","content","setBorderStyle","setShadowStyle","shadowColor","backgroundShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","measureLabelSize","mapKey","drawBox","borderShadowColor","drawLabel","calculateTextAlignment","miterLimit","setTextStrokeStyle","getRectCenterPoint","rotated","cx","cy","scaleValue","getChartDimensionByScale","getChartPoint","xScaleID","yScaleID","getChartRect","xDim","xMax","yDim","yMin","yMax","resolvePointPosition","xAdjust","yAdjust","getChartCircle","BoxAnnotation","halfBorder","labelSize","labelRect","calculateX","calculateY","adjust","calculatePosition$1","boxOpts","padStart","padEnd","pointInLine","interpolateX","interpolateY","sqr","isLineInArea","limitPointToArea","LineAnnotation","dy","lenSq","yy","labelIsVisible","labelX","labelY","intersects","isOnLabel","startOpts","endOpts","startAdjust","endAdjust","arrowStartOpts","arrowHeads","arrowEndOpts","getLineAdjust","getArrowHeads","drawArrowHead","labelTextSize","limitLineToArea","lblPadding","xPadding","yPadding","tempPadding","calculateAutoRotation","rotatedSize","spaceAround","calculateTAdjust","calculateT","xCoordinateSizes","yCoordinateSizes","adjustLabelCoordinate","calculateLabelPosition","loadLabelRect","arrowHeadsDefaults","lineSize","lineW","lineH","coordinate","halfSize","arrowOpts","arrowOffsetX","EllipseAnnotation","ellipse","xRadius","yRadius","cosAngle","sinAngle","pointInEllipse","LabelAnnotation","pointX","pointY","calloutPosition","callout","separatorStart","separatorEnd","getCalloutSeparatorAdjust","getCalloutSeparatorCoord","sideStart","sideEnd","getCalloutSideAdjust","getCalloutSideCoord","rotatedPoint","drawCallout","boxSize","calculatePosition","measureRect","xPoints","yPoints","resolveCalloutAutoPosition","resolveCalloutPosition","PointAnnotation","inPointRange","PolygonAnnotation","isInside","bY","bX","pointIsInPolygon","sides","optionScope","initProperties","annotationTypes","polygon","directUpdater","resolveType","animOpts","resolveAnimations","resyncElements","annotationOptions","getOrCreateElement","resolveElementProperties","toSkip","updateSubElements","resolveAnnotationOptions","mainElement","subElements","subElement","subResolver","elementClass","resolveObj","defs","optDefs","chartStates","pkg","ver","strict","requireVersion","visibleElements","verifyScaleOptions","updateListeners","_getState","caller","drawElements","drawSubElements","annotationPlugin","line_value","chart_data","selected_prop","league","getChartData","stat_entry","singles","doubles","triples","homeruns","runs","rbis","walks","goals","assists","shots","blocked_shots","power_play_goals","power_play_assists","shots_against","goals_against","rush_yards","pass_yards","rec_yards","rush_tds","pass_tds","rec_tds","off_interceptions","player_game","start_time","toLocaleDateString","getChartOptions","line1","setColors","myChart","updateChart","updateData","title_text","logo_url","over_link","fmtOdds","over","top_over","under_link","under","top_under","book_p","toFixed","pick","fmtEv","best","model_p","probabilityToMoneyLine","decimalOdds","ev","probability","roundHalf","value_to_beat","min_value","max_value","my_dist","stats","gamelog","premium_membership","fair_odds","market_lines","using_curve","setPropMetrics","my_prop","curve","sd","p_over","frac","curveDist","market","dist","at_value","chosen","over_ev","under_ev","best_over","best_under","marketRows","receptions","targets","time_on_ice","saves","wins","shutouts","completions","attempts","stolen_bases","batter_strikeouts","strikeouts","pitches_thrown","hits_allowed","walks_allowed","earned_runs","minutes","rebounds","blocks","steals","team","is_pitcher","is_qb","is_goalie","roundToTenth","reInitTooltips","tooltipTriggerEl","bootstrap","dispose","averages","team_img","img","player_stats","variances","projections","prop_metrics","proj_id","placeholder_variances","player_id","means","refreshPlayer","prom1","fetch","response","json","fields","ftm","two_point_fgm","three_point_fgm","turnovers","innings_pitched","quality_starts","fumbles_lost","rush_2pc","rec_2pc","totals","vars","formatted_vars","stat","formatted_stat_key","buildPropCalcMetrics","getPlayerStats","prom2","cats","sport_cats","cat","cat_no_underscore","getProjection","prom3","catch","getFairOdds","combined","stat_name_underscore","available","wanted","defaultProp","combineStats","320","768","1024","1280","1920","site_name","file_name","contests","started_games","matchupList","roster_error","slot_names","built","skipped","build_error","why","min_each_team","city","mascot","slate_name","slate_id","considered","rostered","display_name","fillable_by","replaceAll","readNdjson","onMessage","reader","getReader","decoder","TextDecoder","buffer","handleLine","done","newline","decode","stream","postError","status","games_list","away","home","lineupIds","lineup_info","handleLeave","started","reason","projFP","strategy","strategy_impact","exposure_strategy","exposure_strategy_impact","min_unique_players","generated_lineups","lineups_summary","entries_file","entries_info","entries_busy","swap_result","playerSearchString","sortableCols","players","upcoming_slates","roster","ruleset_name","position_filters","single_game_slate","ANTI_STACK","nfl","stoppers","stopped","mlb","nhl","anti_stack","bring_back","num_lineups","modal_projection_id","modal_player","teamStacks","gameStacks","positionStacks","mobile","startSalary","dragged_player_index","players_rostered","roster_size","teamGameStrings","Modal","sortByX","sortByValue","optimizeLineup","showLoadingDiv","headers","Content-Type","Accept","X-CSRFToken","getCookie","optimizeSettings","lineups","summary","msg","hideLoadingDiv","alert","available_players","correlation","anti_stack_conflict","loadEntriesFile","file","form","FormData","slotNames","clearEntriesFile","csv_name","downloadFilledEntries","blob","URL","createObjectURL","download","revokeObjectURL","filled","fillEntries","note","downloadSwappedEntries","by_entry","entry_index","lateSwap","calcSlotCost","salary_multiplier","getSlotSalaryMultiplier","affordableSlotsFor","dp_pos","cost","am","bm","findAffordableSlot","clearRoster","unrosterPlayer","drag","dragged_player","ref","newDiv","dragImg","playerDiv","textDiv","imgDiv","nameDiv","salaryDiv","projDiv","whiteSpace","nameText","salaryText","projText","dataTransfer","setDragImage","allowDrop","allowable","createCSVContent","include_header","delimiter","csv","createCSV","hiddenElement","encodeURI","copyToClipboard","clipboard","writeText","onresize","current_roster","rule","Boolean","stopper","facing","opp","antiStackConflict","files","ele","gs","game_id","ts","ps","my_stack","dragend","toShortDate","days","buttonName","dateString","selectedWeek","selectedWeeksDays","schedule","weeks","selectedDays","currWeek","updateDOWArray","teamGamesOnSelectedWeek","teamGames","startDate","endDate","trueEnd","gameDate","gameDays","weeksGames","tableRow","tableData","group","checked","player_positions","player_inj_tag","detail_string","city_name","mascot_name","carries","anytime_tds","fp","dk_fp","injury_tag","setPosFilter","sortResult","filterPlayer","batter","name_search","team_search","pos_search","batters","player_search","selected_team","game_strings","pitcher","pitchers","pitching_batting_select","pct","toi","power_play_points","list","skater_goalie_select","skaters","goalies","skaterCols","goalieCols","sortSkaters","sortGoalies","Optimizer","NbaSchedule","NflProj","NbaProj","DailySwiper","MlbProj","NhlProj"],"mappings":"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F,IAAImgF,sPCjM7G3uH,KAAM8sH,YAAY7hF,KAAKC,UAAUE,yCAApC,+CAAzBjpC,2CAA4BnC,KAAM8sH,YAAY7hF,KAAKC,UAAUE,kEAFhCprC,KAAM8sH,YAAY7hF,KAAKE,UAAUC,yCAArC,gDAAzBjpC,2CAA6BnC,KAAM8sH,YAAY7hF,KAAKE,UAAUC,oGAuH3BhgB,SAASprB,KAAMysH,gBACfrhG,SAASprB,KAAM4sH,cACfxhG,SAASprB,KAAMqwH,iBACfjlG,SAASprB,KAAMswH,cACfllG,SAASprB,KAAMusH,iBAC1BnhG,SAASprB,KAAM0sH,o1BAdvCvqH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BqpB,SAASprB,KAAMysH,mCACfrhG,SAASprB,KAAM4sH,iCACfxhG,SAASprB,KAAMqwH,oCACfjlG,SAASprB,KAAMswH,iCACfllG,SAASprB,KAAMusH,oCAC1BnhG,SAASprB,KAAM0sH,mHAtBJthG,SAASprB,KAAM+rH,YACf3gG,SAASprB,KAAMgsH,cACf5gG,SAASprB,KAAMisH,YACf7gG,SAASprB,KAAMksH,oBACf9gG,SAASprB,KAAMmsH,kBAAoB/gG,SAASprB,KAAMosH,yBAC7Dl4G,WAAWlU,KAAMuwH,aAAatC,QAAQ,4yBAd9D9rH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BqpB,SAASprB,KAAM+rH,+BACf3gG,SAASprB,KAAMgsH,iCACf5gG,SAASprB,KAAMisH,+BACf7gG,SAASprB,KAAMksH,uCACf9gG,SAASprB,KAAMmsH,kBAAoB/gG,SAASprB,KAAMosH,4CAC7Dl4G,WAAWlU,KAAMuwH,aAAatC,QAAQ,4GAtB3B7iG,SAASprB,KAAMwwH,YACfplG,SAASprB,KAAMqsH,oBACfjhG,SAASprB,KAAMssH,oBACflhG,SAASprB,KAAMywH,WACfrlG,SAASprB,KAAM0wH,eAC1Bx8G,WAAWlU,KAAMuwH,aAAatC,QAAQ,0yBAd9D9rH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BqpB,SAASprB,KAAMwwH,+BACfplG,SAASprB,KAAMqsH,uCACfjhG,SAASprB,KAAMssH,uCACflhG,SAASprB,KAAMywH,8BACfrlG,SAASprB,KAAM0wH,kCAC1Bx8G,WAAWlU,KAAMuwH,aAAatC,QAAQ,gHAtB3B7iG,SAASprB,KAAMwsH,iBACfphG,SAASprB,KAAM2sH,eACfvhG,SAASprB,KAAM2wH,kBAAiBvlG,SAASprB,KAAM4wH,eAC/CxlG,SAASprB,KAAM6sH,wBACfzhG,SAASprB,KAAMusH,iBAC1BnhG,SAASprB,KAAM0sH,2iBAHwB,yTAX/DvqH,kBAQAA,SACIJ,qBACAA,qBACAA,mCACAA,qBACAA,qBACAA,kCAL+BqpB,SAASprB,KAAMwsH,oCACfphG,SAASprB,KAAM2sH,kCACfvhG,SAASprB,KAAM2wH,qCAAiBvlG,SAASprB,KAAM4wH,kCAC/CxlG,SAASprB,KAAM6sH,2CACfzhG,SAASprB,KAAMusH,oCAC1BnhG,SAASprB,KAAM0sH,mHAtBJthG,SAASprB,KAAMwrH,SAASpgG,SAASprB,KAAMyrH,SAASrgG,SAASprB,KAAM0rH,SAAStgG,SAASprB,KAAM2rH,eACvFvgG,SAASprB,KAAM4rH,WACfxgG,SAASprB,KAAM6rH,WACfzgG,SAASprB,KAAM6wH,mBACfzlG,SAASprB,KAAM8rH,YAC1B1gG,SAASprB,KAAM8wH,8zBAdvC3uH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BqpB,SAASprB,KAAMwrH,SAASpgG,SAASprB,KAAMyrH,SAASrgG,SAASprB,KAAM0rH,SAAStgG,SAASprB,KAAM2rH,kCACvFvgG,SAASprB,KAAM4rH,8BACfxgG,SAASprB,KAAM6rH,8BACfzgG,SAASprB,KAAM6wH,sCACfzlG,SAASprB,KAAM8rH,+BAC1B1gG,SAASprB,KAAM8wH,4HAtBJ9wH,KAAM+wH,gBACN/wH,KAAMywH,UACNzwH,KAAMgxH,oBACNhxH,KAAMixH,kBACNjxH,KAAMkxH,mBACjBlxH,KAA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"}