From c44ed4dc9790279fe927cf84895feb1149d3096d Mon Sep 17 00:00:00 2001 From: Steffen Deusch Date: Sat, 9 Nov 2024 12:41:16 +0100 Subject: [PATCH 1/2] Allow users to render content in the Relates to: #455 --- assets/js/app.js | 4 +- dist/css/app.css | 11909 +--------------- dist/js/app.js | 8 +- dist/js/app.js.map | 4 +- lib/phoenix/live_dashboard/layout_view.ex | 16 + .../live_dashboard/layouts/dash.html.heex | 2 + lib/phoenix/live_dashboard/page_builder.ex | 94 +- 7 files changed, 123 insertions(+), 11914 deletions(-) diff --git a/assets/js/app.js b/assets/js/app.js index b0dd45c9..dd0889c6 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -18,10 +18,12 @@ let Hooks = { PhxRememberRefresh: PhxRememberRefresh } +window.customHooks = window.customHooks || {} + let socketPath = document.querySelector("html").getAttribute("phx-socket") || "/live" let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") let liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, { - hooks: Hooks, + hooks: { ...Hooks, ...window.customHooks }, params: (liveViewName) => { return { _csrf_token: csrfToken, diff --git a/dist/css/app.css b/dist/css/app.css index 00594d7c..c638f54f 100644 --- a/dist/css/app.css +++ b/dist/css/app.css @@ -1,11914 +1,11 @@ -@charset "UTF-8"; -/* Make clicks pass-through */ -#nprogress { - pointer-events: none; -} - -#nprogress .bar { - background: #29d; - position: fixed; - z-index: 1031; - top: 0; - left: 0; - width: 100%; - height: 2px; -} - -/* Fancy blur effect */ -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px #29d, 0 0 5px #29d; - opacity: 1; - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -/* Remove these to get rid of the spinner */ -#nprogress .spinner { - display: block; - position: fixed; - z-index: 1031; - top: 15px; - right: 15px; -} - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - border: solid 2px transparent; - border-top-color: #29d; - border-left-color: #29d; - border-radius: 50%; - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@-webkit-keyframes nprogress-spinner { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} -@keyframes nprogress-spinner { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} -.uplot, .uplot *, .uplot *::before, .uplot *::after { - box-sizing: border-box; -} - -.uplot { - font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - line-height: 1.5; - width: min-content; -} - -.u-title { - text-align: center; - font-size: 18px; - font-weight: bold; -} - -.u-wrap { - position: relative; - user-select: none; -} - -.u-over, .u-under { - position: absolute; -} - -.u-under { - overflow: hidden; -} - -.uplot canvas { - display: block; - position: relative; - width: 100%; - height: 100%; -} - -.u-axis { - position: absolute; -} - -.u-legend { - font-size: 14px; - margin: auto; - text-align: center; -} - -.u-inline { - display: block; -} - -.u-inline * { - display: inline-block; -} - -.u-inline tr { - margin-right: 16px; -} - -.u-legend th { - font-weight: 600; -} - -.u-legend th > * { - vertical-align: middle; - display: inline-block; -} - -.u-legend .u-marker { - width: 1em; - height: 1em; - margin-right: 4px; - background-clip: padding-box !important; -} - -.u-inline.u-live th::after { - content: ":"; - vertical-align: middle; -} - -.u-inline:not(.u-live) .u-value { - display: none; -} - -.u-series > * { - padding: 4px; -} - -.u-series th { - cursor: pointer; -} - -.u-legend .u-off > * { - opacity: 0.3; -} - -.u-select { - background: rgba(0, 0, 0, 0.07); - position: absolute; - pointer-events: none; -} - -.u-cursor-x, .u-cursor-y { - position: absolute; - left: 0; - top: 0; - pointer-events: none; - will-change: transform; - z-index: 100; -} - -.u-hz .u-cursor-x, .u-vt .u-cursor-y { - height: 100%; - border-right: 1px dashed #607D8B; -} - -.u-hz .u-cursor-y, .u-vt .u-cursor-x { - width: 100%; - border-bottom: 1px dashed #607D8B; -} - -.u-cursor-pt { - position: absolute; - top: 0; - left: 0; - border-radius: 50%; - border: 0 solid; - pointer-events: none; - will-change: transform; - z-index: 100; /*this has to be !important since we set inline "background" shorthand */ - background-clip: padding-box !important; -} - -.u-axis.u-off, .u-select.u-off, .u-cursor-x.u-off, .u-cursor-y.u-off, .u-cursor-pt.u-off { - display: none; -} /*! +#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px, -4px);-ms-transform:rotate(3deg) translate(0px, -4px);transform:rotate(3deg) translate(0px, -4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.uplot,.uplot *,.uplot *::before,.uplot *::after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:bold}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box !important}.u-inline.u-live th::after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:rgba(0, 0, 0, 0.07);position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform;z-index:100}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607d8b}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607d8b}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;z-index:100;background-clip:padding-box !important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}/*! * Fonts are (c) 2011 by vernon adams (see below). LiveDashboardFont changes are in public domain. * Copyright (c) 2011 by vernon adams (vern@newtypography.co.uk), * with Reserved Font Name “Muli”. * Licensed under SIL Open Font License: https://www.fontsquirrel.com/license/muli -*/ -@font-face { - font-family: "LiveDashboardFont"; - font-style: normal; - font-display: swap; - src: url("data:font/woff2;base64,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") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/*! +*/@font-face{font-family:"LiveDashboardFont";font-style:normal;font-display:swap;src:url("data:font/woff2;base64,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") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! * Bootstrap v4.6.2 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #fd7e14; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #4575cf; - --secondary: #6c757d; - --success: #28a745; - --info: #17a2b8; - --warning: #ffc107; - --danger: #dc3545; - --light: #f8f9fa; - --dark: #343a40; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --breakpoint-xxl: 1600px; - --breakpoint-xxxl: 2600px; - --font-family-sans-serif: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus:not(:focus-visible) { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: #4575cf; - text-decoration: none; - background-color: transparent; -} -a:hover { - color: #29529f; - text-decoration: underline; -} - -a:not([href]):not([class]) { - color: inherit; - text-decoration: none; -} -a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: rgba(85, 91, 104, 0.5); - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type=button]::-moz-focus-inner, -[type=reset]::-moz-focus-inner, -[type=submit]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type=radio], -input[type=checkbox] { - box-sizing: border-box; - padding: 0; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type=number]::-webkit-inner-spin-button, -[type=number]::-webkit-outer-spin-button { - height: auto; -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type=search]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -h1, .h1 { - font-size: 2.5rem; -} - -h2, .h2 { - font-size: 2rem; -} - -h3, .h3 { - font-size: 1.75rem; -} - -h4, .h4 { - font-size: 1.5rem; -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} - -small, -.small { - font-size: 0.875em; - font-weight: 400; -} - -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} - -.blockquote-footer { - display: block; - font-size: 0.875em; - color: #6c757d; -} -.blockquote-footer::before { - content: "— "; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: 6px; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #6c757d; -} - -code { - font-size: 87.5%; - color: #e83e8c; - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: 0.2rem; -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} - -pre { - display: block; - font-size: 87.5%; - color: #212529; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container, -.container-fluid, -.container-xxxl, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - width: 100%; - padding-right: 12px; - padding-left: 12px; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1600px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1300px; - } -} -@media (min-width: 2600px) { - .container-xxxl, .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1500px; - } -} -.row { - display: flex; - flex-wrap: wrap; - margin-right: -12px; - margin-left: -12px; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} -.no-gutters > .col, -.no-gutters > [class*=col-] { - padding-right: 0; - padding-left: 0; -} - -.col-xxxl, -.col-xxxl-auto, .col-xxxl-12, .col-xxxl-11, .col-xxxl-10, .col-xxxl-9, .col-xxxl-8, .col-xxxl-7, .col-xxxl-6, .col-xxxl-5, .col-xxxl-4, .col-xxxl-3, .col-xxxl-2, .col-xxxl-1, .col-xxl, -.col-xxl-auto, .col-xxl-12, .col-xxl-11, .col-xxl-10, .col-xxl-9, .col-xxl-8, .col-xxl-7, .col-xxl-6, .col-xxl-5, .col-xxl-4, .col-xxl-3, .col-xxl-2, .col-xxl-1, .col-xl, -.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, -.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, -.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, -.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, -.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { - position: relative; - width: 100%; - padding-right: 12px; - padding-left: 12px; -} - -.col { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; -} - -.row-cols-1 > * { - flex: 0 0 100%; - max-width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 50%; - max-width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; -} - -.row-cols-4 > * { - flex: 0 0 25%; - max-width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 20%; - max-width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; -} - -.col-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; -} - -.col-3 { - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; -} - -.col-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; -} - -.col-6 { - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; -} - -.col-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; -} - -.col-9 { - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; -} - -.col-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; -} - -.col-12 { - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - order: -1; -} - -.order-last { - order: 13; -} - -.order-0 { - order: 0; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.order-3 { - order: 3; -} - -.order-4 { - order: 4; -} - -.order-5 { - order: 5; -} - -.order-6 { - order: 6; -} - -.order-7 { - order: 7; -} - -.order-8 { - order: 8; -} - -.order-9 { - order: 9; -} - -.order-10 { - order: 10; -} - -.order-11 { - order: 11; -} - -.order-12 { - order: 12; -} - -.offset-1 { - margin-left: 8.33333333%; -} - -.offset-2 { - margin-left: 16.66666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333333%; -} - -.offset-5 { - margin-left: 41.66666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333333%; -} - -.offset-8 { - margin-left: 66.66666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333333%; -} - -.offset-11 { - margin-left: 91.66666667%; -} - -@media (min-width: 576px) { - .col-sm { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-sm-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-sm-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - order: -1; - } - .order-sm-last { - order: 13; - } - .order-sm-0 { - order: 0; - } - .order-sm-1 { - order: 1; - } - .order-sm-2 { - order: 2; - } - .order-sm-3 { - order: 3; - } - .order-sm-4 { - order: 4; - } - .order-sm-5 { - order: 5; - } - .order-sm-6 { - order: 6; - } - .order-sm-7 { - order: 7; - } - .order-sm-8 { - order: 8; - } - .order-sm-9 { - order: 9; - } - .order-sm-10 { - order: 10; - } - .order-sm-11 { - order: 11; - } - .order-sm-12 { - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333333%; - } - .offset-sm-2 { - margin-left: 16.66666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333333%; - } - .offset-sm-5 { - margin-left: 41.66666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333333%; - } - .offset-sm-8 { - margin-left: 66.66666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333333%; - } - .offset-sm-11 { - margin-left: 91.66666667%; - } -} -@media (min-width: 768px) { - .col-md { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-md-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-md-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-md-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - order: -1; - } - .order-md-last { - order: 13; - } - .order-md-0 { - order: 0; - } - .order-md-1 { - order: 1; - } - .order-md-2 { - order: 2; - } - .order-md-3 { - order: 3; - } - .order-md-4 { - order: 4; - } - .order-md-5 { - order: 5; - } - .order-md-6 { - order: 6; - } - .order-md-7 { - order: 7; - } - .order-md-8 { - order: 8; - } - .order-md-9 { - order: 9; - } - .order-md-10 { - order: 10; - } - .order-md-11 { - order: 11; - } - .order-md-12 { - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333333%; - } - .offset-md-2 { - margin-left: 16.66666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333333%; - } - .offset-md-5 { - margin-left: 41.66666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333333%; - } - .offset-md-8 { - margin-left: 66.66666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333333%; - } - .offset-md-11 { - margin-left: 91.66666667%; - } -} -@media (min-width: 992px) { - .col-lg { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-lg-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-lg-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - order: -1; - } - .order-lg-last { - order: 13; - } - .order-lg-0 { - order: 0; - } - .order-lg-1 { - order: 1; - } - .order-lg-2 { - order: 2; - } - .order-lg-3 { - order: 3; - } - .order-lg-4 { - order: 4; - } - .order-lg-5 { - order: 5; - } - .order-lg-6 { - order: 6; - } - .order-lg-7 { - order: 7; - } - .order-lg-8 { - order: 8; - } - .order-lg-9 { - order: 9; - } - .order-lg-10 { - order: 10; - } - .order-lg-11 { - order: 11; - } - .order-lg-12 { - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333333%; - } - .offset-lg-2 { - margin-left: 16.66666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333333%; - } - .offset-lg-5 { - margin-left: 41.66666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333333%; - } - .offset-lg-8 { - margin-left: 66.66666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333333%; - } - .offset-lg-11 { - margin-left: 91.66666667%; - } -} -@media (min-width: 1200px) { - .col-xl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-xl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xl-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - order: -1; - } - .order-xl-last { - order: 13; - } - .order-xl-0 { - order: 0; - } - .order-xl-1 { - order: 1; - } - .order-xl-2 { - order: 2; - } - .order-xl-3 { - order: 3; - } - .order-xl-4 { - order: 4; - } - .order-xl-5 { - order: 5; - } - .order-xl-6 { - order: 6; - } - .order-xl-7 { - order: 7; - } - .order-xl-8 { - order: 8; - } - .order-xl-9 { - order: 9; - } - .order-xl-10 { - order: 10; - } - .order-xl-11 { - order: 11; - } - .order-xl-12 { - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333333%; - } - .offset-xl-2 { - margin-left: 16.66666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333333%; - } - .offset-xl-5 { - margin-left: 41.66666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333333%; - } - .offset-xl-8 { - margin-left: 66.66666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333333%; - } - .offset-xl-11 { - margin-left: 91.66666667%; - } -} -@media (min-width: 1600px) { - .col-xxl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-xxl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xxl-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-xxl-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-xxl-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-xxl-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-xxl-first { - order: -1; - } - .order-xxl-last { - order: 13; - } - .order-xxl-0 { - order: 0; - } - .order-xxl-1 { - order: 1; - } - .order-xxl-2 { - order: 2; - } - .order-xxl-3 { - order: 3; - } - .order-xxl-4 { - order: 4; - } - .order-xxl-5 { - order: 5; - } - .order-xxl-6 { - order: 6; - } - .order-xxl-7 { - order: 7; - } - .order-xxl-8 { - order: 8; - } - .order-xxl-9 { - order: 9; - } - .order-xxl-10 { - order: 10; - } - .order-xxl-11 { - order: 11; - } - .order-xxl-12 { - order: 12; - } - .offset-xxl-0 { - margin-left: 0; - } - .offset-xxl-1 { - margin-left: 8.33333333%; - } - .offset-xxl-2 { - margin-left: 16.66666667%; - } - .offset-xxl-3 { - margin-left: 25%; - } - .offset-xxl-4 { - margin-left: 33.33333333%; - } - .offset-xxl-5 { - margin-left: 41.66666667%; - } - .offset-xxl-6 { - margin-left: 50%; - } - .offset-xxl-7 { - margin-left: 58.33333333%; - } - .offset-xxl-8 { - margin-left: 66.66666667%; - } - .offset-xxl-9 { - margin-left: 75%; - } - .offset-xxl-10 { - margin-left: 83.33333333%; - } - .offset-xxl-11 { - margin-left: 91.66666667%; - } -} -@media (min-width: 2600px) { - .col-xxxl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .row-cols-xxxl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-xxxl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-xxxl-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - .row-cols-xxxl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-xxxl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-xxxl-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - .col-xxxl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xxxl-1 { - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .col-xxxl-2 { - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .col-xxxl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .col-xxxl-4 { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .col-xxxl-5 { - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .col-xxxl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .col-xxxl-7 { - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .col-xxxl-8 { - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .col-xxxl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .col-xxxl-10 { - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .col-xxxl-11 { - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .col-xxxl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .order-xxxl-first { - order: -1; - } - .order-xxxl-last { - order: 13; - } - .order-xxxl-0 { - order: 0; - } - .order-xxxl-1 { - order: 1; - } - .order-xxxl-2 { - order: 2; - } - .order-xxxl-3 { - order: 3; - } - .order-xxxl-4 { - order: 4; - } - .order-xxxl-5 { - order: 5; - } - .order-xxxl-6 { - order: 6; - } - .order-xxxl-7 { - order: 7; - } - .order-xxxl-8 { - order: 8; - } - .order-xxxl-9 { - order: 9; - } - .order-xxxl-10 { - order: 10; - } - .order-xxxl-11 { - order: 11; - } - .order-xxxl-12 { - order: 12; - } - .offset-xxxl-0 { - margin-left: 0; - } - .offset-xxxl-1 { - margin-left: 8.33333333%; - } - .offset-xxxl-2 { - margin-left: 16.66666667%; - } - .offset-xxxl-3 { - margin-left: 25%; - } - .offset-xxxl-4 { - margin-left: 33.33333333%; - } - .offset-xxxl-5 { - margin-left: 41.66666667%; - } - .offset-xxxl-6 { - margin-left: 50%; - } - .offset-xxxl-7 { - margin-left: 58.33333333%; - } - .offset-xxxl-8 { - margin-left: 66.66666667%; - } - .offset-xxxl-9 { - margin-left: 75%; - } - .offset-xxxl-10 { - margin-left: 83.33333333%; - } - .offset-xxxl-11 { - margin-left: 91.66666667%; - } -} -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529; -} -.table th, -.table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #dee2e6; -} -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #dee2e6; -} -.table tbody + tbody { - border-top: 2px solid #dee2e6; -} - -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - -.table-bordered { - border: 1px solid #dee2e6; -} -.table-bordered th, -.table-bordered td { - border: 1px solid #dee2e6; -} -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} - -.table-hover tbody tr:hover { - color: #212529; - background-color: rgba(0, 0, 0, 0.075); -} - -.table-primary, -.table-primary > th, -.table-primary > td { - background-color: #cbd8f2; -} -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody { - border-color: #9eb7e6; -} - -.table-hover .table-primary:hover { - background-color: #b7c9ed; -} -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th { - background-color: #b7c9ed; -} - -.table-secondary, -.table-secondary > th, -.table-secondary > td { - background-color: #d6d8db; -} -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody { - border-color: #b3b7bb; -} - -.table-hover .table-secondary:hover { - background-color: #c8cbcf; -} -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th { - background-color: #c8cbcf; -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #c3e6cb; -} -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody { - border-color: #8fd19e; -} - -.table-hover .table-success:hover { - background-color: #b1dfbb; -} -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #b1dfbb; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #bee5eb; -} -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody { - border-color: #86cfda; -} - -.table-hover .table-info:hover { - background-color: #abdde5; -} -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #abdde5; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #ffeeba; -} -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody { - border-color: #ffdf7e; -} - -.table-hover .table-warning:hover { - background-color: #ffe8a1; -} -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f5c6cb; -} -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody { - border-color: #ed969e; -} - -.table-hover .table-danger:hover { - background-color: #f1b0b7; -} -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} - -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody { - border-color: #fbfcfc; -} - -.table-hover .table-light:hover { - background-color: #ececf6; -} -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} - -.table-dark, -.table-dark > th, -.table-dark > td { - background-color: #c6c8ca; -} -.table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #95999c; -} - -.table-hover .table-dark:hover { - background-color: #b9bbbe; -} -.table-hover .table-dark:hover > td, -.table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} - -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55; -} -.table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #dee2e6; -} - -.table-dark { - color: #fff; - background-color: #343a40; -} -.table-dark th, -.table-dark td, -.table-dark thead th { - border-color: #454d55; -} -.table-dark.table-bordered { - border: 0; -} -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.075); -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-sm > .table-bordered { - border: 0; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-md > .table-bordered { - border: 0; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-lg > .table-bordered { - border: 0; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xl > .table-bordered { - border: 0; - } -} -@media (max-width: 1599.98px) { - .table-responsive-xxl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xxl > .table-bordered { - border: 0; - } -} -@media (max-width: 2599.98px) { - .table-responsive-xxxl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xxxl > .table-bordered { - border: 0; - } -} -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} -.table-responsive > .table-bordered { - border: 0; -} - -.form-control { - display: block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 6px; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control:focus { - color: #495057; - background-color: #fff; - border-color: #aac0e9; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.form-control::placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:disabled, .form-control[readonly] { - background-color: #e9ecef; - opacity: 1; -} - -input[type=date].form-control, -input[type=time].form-control, -input[type=datetime-local].form-control, -input[type=month].form-control { - appearance: none; -} - -select.form-control:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #495057; -} -select.form-control:focus::-ms-value { - color: #495057; - background-color: #fff; -} - -.form-control-file, -.form-control-range { - display: block; - width: 100%; -} - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; - line-height: 1.5; -} - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - font-size: 1rem; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -select.form-control[size], select.form-control[multiple] { - height: auto; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-text { - display: block; - margin-top: 0.25rem; -} - -.form-row { - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px; -} -.form-row > .col, -.form-row > [class*=col-] { - padding-right: 5px; - padding-left: 5px; -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem; -} - -.form-check-input { - position: absolute; - margin-top: 0.3rem; - margin-left: -1.25rem; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - color: rgba(85, 91, 104, 0.5); -} - -.form-check-label { - margin-bottom: 0; -} - -.form-check-inline { - display: inline-flex; - align-items: center; - padding-left: 0; - margin-right: 0.75rem; -} -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: 0.3125rem; - margin-left: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #28a745; -} - -.valid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, 0.9); - border-radius: 6px; -} -.form-row > .col > .valid-tooltip, .form-row > [class*=col-] > .valid-tooltip { - left: 5px; -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: #28a745; - padding-right: calc(1.5em + 0.75rem) !important; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated select.form-control:valid, select.form-control.is-valid { - padding-right: 3rem !important; - background-position: right 1.5rem center; -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:valid, .custom-select.is-valid { - border-color: #28a745; - padding-right: calc(0.75em + 2.3125rem) !important; - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; -} -.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #28a745; -} -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { - color: #28a745; -} -.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - border-color: #28a745; -} -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57; -} -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #28a745; -} - -.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { - border-color: #28a745; -} -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #dc3545; -} - -.invalid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 6px; -} -.form-row > .col > .invalid-tooltip, .form-row > [class*=col-] > .invalid-tooltip { - left: 5px; -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem) !important; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated select.form-control:invalid, select.form-control.is-invalid { - padding-right: 3rem !important; - background-position: right 1.5rem center; -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:invalid, .custom-select.is-invalid { - border-color: #dc3545; - padding-right: calc(0.75em + 2.3125rem) !important; - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; -} -.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; -} -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { - color: #dc3545; -} -.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { - border-color: #dc3545; -} -.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d; -} -.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #dc3545; -} - -.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { - border-color: #dc3545; -} -.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.form-inline { - display: flex; - flex-flow: row wrap; - align-items: center; -} -.form-inline .form-check { - width: 100%; -} -@media (min-width: 576px) { - .form-inline label { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: flex; - flex: 0 0 auto; - flex-flow: row wrap; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-plaintext { - display: inline-block; - } - .form-inline .input-group, - .form-inline .custom-select { - width: auto; - } - .form-inline .form-check { - display: flex; - align-items: center; - justify-content: center; - width: auto; - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - flex-shrink: 0; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - align-items: center; - justify-content: center; - } - .form-inline .custom-control-label { - margin-bottom: 0; - } -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: 3px; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} -.btn:hover { - color: #212529; - text-decoration: none; -} -.btn:focus, .btn.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.btn.disabled, .btn:disabled { - opacity: 0.65; -} -.btn:not(:disabled):not(.disabled) { - cursor: pointer; -} -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.btn-primary:hover { - color: #fff; - background-color: #3162bd; - border-color: #2e5cb3; -} -.btn-primary:focus, .btn-primary.focus { - color: #fff; - background-color: #3162bd; - border-color: #2e5cb3; - box-shadow: 0 0 0 0.2rem rgba(97, 138, 214, 0.5); -} -.btn-primary.disabled, .btn-primary:disabled { - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #2e5cb3; - border-color: #2c57a9; -} -.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(97, 138, 214, 0.5); -} - -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:hover { - color: #fff; - background-color: #5a6268; - border-color: #545b62; -} -.btn-secondary:focus, .btn-secondary.focus { - color: #fff; - background-color: #5a6268; - border-color: #545b62; - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} -.btn-secondary.disabled, .btn-secondary:disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #545b62; - border-color: #4e555b; -} -.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} -.btn-success:focus, .btn-success.focus { - color: #fff; - background-color: #218838; - border-color: #1e7e34; - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} -.btn-success.disabled, .btn-success:disabled { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; -} -.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} -.btn-info:focus, .btn-info.focus { - color: #fff; - background-color: #138496; - border-color: #117a8b; - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} -.btn-info.disabled, .btn-info:disabled { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; -} -.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-warning { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:hover { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; -} -.btn-warning:focus, .btn-warning.focus { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} -.btn-warning.disabled, .btn-warning:disabled { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { - color: #212529; - background-color: #d39e00; - border-color: #c69500; -} -.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} -.btn-danger:focus, .btn-danger.focus { - color: #fff; - background-color: #c82333; - border-color: #bd2130; - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} -.btn-danger.disabled, .btn-danger:disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; -} -.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-light { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:hover { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; -} -.btn-light:focus, .btn-light.focus { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} -.btn-light.disabled, .btn-light:disabled { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { - color: #212529; - background-color: #dae0e5; - border-color: #d3d9df; -} -.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} -.btn-dark:focus, .btn-dark.focus { - color: #fff; - background-color: #23272b; - border-color: #1d2124; - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} -.btn-dark.disabled, .btn-dark:disabled { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; -} -.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-outline-primary { - color: #4575cf; - border-color: #4575cf; -} -.btn-outline-primary:hover { - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.btn-outline-primary:focus, .btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5); -} -.btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #4575cf; - background-color: transparent; -} -.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5); -} - -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:focus, .btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success { - color: #28a745; - border-color: #28a745; -} -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:focus, .btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.btn-outline-success.disabled, .btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} -.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-info { - color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:focus, .btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.btn-outline-info.disabled, .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} -.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:focus, .btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} -.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:focus, .btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} -.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:focus, .btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.btn-outline-light.disabled, .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} -.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark { - color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:focus, .btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.btn-outline-dark.disabled, .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} -.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-link { - font-weight: 400; - color: #4575cf; - text-decoration: none; -} -.btn-link:hover { - color: #29529f; - text-decoration: underline; -} -.btn-link:focus, .btn-link.focus { - text-decoration: underline; -} -.btn-link:disabled, .btn-link.disabled { - color: #6c757d; - pointer-events: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type=submit].btn-block, -input[type=reset].btn-block, -input[type=button].btn-block { - width: 100%; -} - -.fade { - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} -.collapsing.width { - width: 0; - height: auto; - transition: width 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing.width { - transition: none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 6px; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} -@media (min-width: 1600px) { - .dropdown-menu-xxl-left { - right: auto; - left: 0; - } - .dropdown-menu-xxl-right { - right: 0; - left: auto; - } -} -@media (min-width: 2600px) { - .dropdown-menu-xxxl-left { - right: auto; - left: 0; - } - .dropdown-menu-xxxl-right { - right: 0; - left: auto; - } -} -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropright .dropdown-toggle::after { - vertical-align: 0; -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} -.dropleft .dropdown-toggle::after { - display: none; -} -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { - right: auto; - bottom: auto; -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; -} -.dropdown-item:hover, .dropdown-item:focus { - color: #16181b; - text-decoration: none; - background-color: #e9ecef; -} -.dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #4575cf; -} -.dropdown-item.disabled, .dropdown-item:disabled { - color: #adb5bd; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; - color: #212529; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 1; -} -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { - margin-left: 0; -} -.dropleft .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.btn-group-toggle > .btn, -.btn-group-toggle > .btn-group > .btn { - margin-bottom: 0; -} -.btn-group-toggle > .btn input[type=radio], -.btn-group-toggle > .btn input[type=checkbox], -.btn-group-toggle > .btn-group > .btn input[type=radio], -.btn-group-toggle > .btn-group > .btn input[type=checkbox] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; - margin-bottom: 0; -} -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file { - margin-left: -1px; -} -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { - z-index: 3; -} -.input-group > .custom-file .custom-file-input:focus { - z-index: 4; -} -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group > .custom-file { - display: flex; - align-items: center; -} -.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group:not(.has-validation) > .form-control:not(:last-child), -.input-group:not(.has-validation) > .custom-select:not(:last-child), -.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label, -.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group.has-validation > .form-control:nth-last-child(n+3), -.input-group.has-validation > .custom-select:nth-last-child(n+3), -.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label, -.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-prepend, -.input-group-append { - display: flex; -} -.input-group-prepend .btn, -.input-group-append .btn { - position: relative; - z-index: 2; -} -.input-group-prepend .btn:focus, -.input-group-append .btn:focus { - z-index: 3; -} -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn { - margin-left: -1px; -} - -.input-group-prepend { - margin-right: -1px; -} - -.input-group-append { - margin-left: -1px; -} - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 6px; -} -.input-group-text input[type=radio], -.input-group-text input[type=checkbox] { - margin-top: 0; -} - -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select { - height: calc(1.5em + 1rem + 2px); -} - -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select { - height: calc(1.5em + 0.5rem + 2px); -} - -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.input-group-lg > .custom-select, -.input-group-sm > .custom-select { - padding-right: 1.75rem; -} - -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn, -.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text, -.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .btn, -.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.custom-control { - position: relative; - z-index: 1; - display: block; - min-height: 1.5rem; - padding-left: 1.5rem; - print-color-adjust: exact; -} - -.custom-control-inline { - display: inline-flex; - margin-right: 1rem; -} - -.custom-control-input { - position: absolute; - left: 0; - z-index: -1; - width: 1rem; - height: 1.25rem; - opacity: 0; -} -.custom-control-input:checked ~ .custom-control-label::before { - color: #fff; - border-color: #4575cf; - background-color: #4575cf; -} -.custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { - border-color: #aac0e9; -} -.custom-control-input:not(:disabled):active ~ .custom-control-label::before { - color: #fff; - background-color: #d3def4; - border-color: #d3def4; -} -.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { - color: #6c757d; -} -.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { - background-color: #e9ecef; -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top; -} -.custom-control-label::before { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - content: ""; - background-color: #fff; - border: 1px solid #adb5bd; -} -.custom-control-label::after { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - content: ""; - background: 50%/50% 50% no-repeat; -} - -.custom-checkbox .custom-control-label::before { - border-radius: 6px; -} -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { - border-color: #4575cf; - background-color: #4575cf; -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(69, 117, 207, 0.5); -} -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { - background-color: rgba(69, 117, 207, 0.5); -} - -.custom-radio .custom-control-label::before { - border-radius: 50%; -} -.custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} -.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(69, 117, 207, 0.5); -} - -.custom-switch { - padding-left: 2.25rem; -} -.custom-switch .custom-control-label::before { - left: -2.25rem; - width: 1.75rem; - pointer-events: all; - border-radius: 0.5rem; -} -.custom-switch .custom-control-label::after { - top: calc(0.25rem + 2px); - left: calc(-2.25rem + 2px); - width: calc(1rem - 4px); - height: calc(1rem - 4px); - background-color: #adb5bd; - border-radius: 0.5rem; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-switch .custom-control-label::after { - transition: none; - } -} -.custom-switch .custom-control-input:checked ~ .custom-control-label::after { - background-color: #fff; - transform: translateX(0.75rem); -} -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(69, 117, 207, 0.5); -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat; - border: 1px solid #ced4da; - border-radius: 6px; - appearance: none; -} -.custom-select:focus { - border-color: #aac0e9; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-select:focus::-ms-value { - color: #495057; - background-color: #fff; -} -.custom-select[multiple], .custom-select[size]:not([size="1"]) { - height: auto; - padding-right: 0.75rem; - background-image: none; -} -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef; -} -.custom-select::-ms-expand { - display: none; -} -.custom-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #495057; -} - -.custom-select-sm { - height: calc(1.5em + 0.5rem + 2px); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin-bottom: 0; -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin: 0; - overflow: hidden; - opacity: 0; -} -.custom-file-input:focus ~ .custom-file-label { - border-color: #aac0e9; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label { - background-color: #e9ecef; -} -.custom-file-input:lang(en) ~ .custom-file-label::after { - content: "Browse"; -} -.custom-file-input ~ .custom-file-label[data-browse]::after { - content: attr(data-browse); -} - -.custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - overflow: hidden; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 6px; -} -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + 0.75rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - content: "Browse"; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 6px 6px 0; -} - -.custom-range { - width: 100%; - height: 1.4rem; - padding: 0; - background-color: transparent; - appearance: none; -} -.custom-range:focus { - outline: 0; -} -.custom-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} -.custom-range::-moz-focus-outer { - border: 0; -} -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #4575cf; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-webkit-slider-thumb { - transition: none; - } -} -.custom-range::-webkit-slider-thumb:active { - background-color: #d3def4; -} -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #4575cf; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-moz-range-thumb { - transition: none; - } -} -.custom-range::-moz-range-thumb:active { - background-color: #d3def4; -} -.custom-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: 0.2rem; - margin-left: 0.2rem; - background-color: #4575cf; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-ms-thumb { - transition: none; - } -} -.custom-range::-ms-thumb:active { - background-color: #d3def4; -} -.custom-range::-ms-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: 0.5rem; -} -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default; -} -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-moz-range-track { - cursor: default; -} -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd; -} - -.custom-control-label::before, -.custom-file-label, -.custom-select { - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - transition: none; - } -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5rem 1rem; -} -.nav-link:hover, .nav-link:focus { - text-decoration: none; -} -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} -.nav-tabs .nav-link { - margin-bottom: -1px; - background-color: transparent; - border: 1px solid transparent; - border-top-left-radius: 6px; - border-top-right-radius: 6px; -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - isolation: isolate; - border-color: #e9ecef #e9ecef #dee2e6; -} -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills .nav-link { - background: none; - border: 0; - border-radius: 6px; -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #756f9a; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: 0.5rem 1rem; -} -.navbar .container, -.navbar .container-fluid, -.navbar .container-sm, -.navbar .container-md, -.navbar .container-lg, -.navbar .container-xl, -.navbar .container-xxl, -.navbar .container-xxxl { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} -.navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} -.navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; -} - -.navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} -.navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 3px; -} -.navbar-toggler:hover, .navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: 50%/100% 100% no-repeat; -} - -.navbar-nav-scroll { - max-height: 75vh; - overflow-y: auto; -} - -@media (max-width: 575.98px) { - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, - .navbar-expand-sm > .container-sm, - .navbar-expand-sm > .container-md, - .navbar-expand-sm > .container-lg, - .navbar-expand-sm > .container-xl, - .navbar-expand-sm > .container-xxl, - .navbar-expand-sm > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 576px) { - .navbar-expand-sm { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, - .navbar-expand-sm > .container-sm, - .navbar-expand-sm > .container-md, - .navbar-expand-sm > .container-lg, - .navbar-expand-sm > .container-xl, - .navbar-expand-sm > .container-xxl, - .navbar-expand-sm > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } -} -@media (max-width: 767.98px) { - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, - .navbar-expand-md > .container-sm, - .navbar-expand-md > .container-md, - .navbar-expand-md > .container-lg, - .navbar-expand-md > .container-xl, - .navbar-expand-md > .container-xxl, - .navbar-expand-md > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, - .navbar-expand-md > .container-sm, - .navbar-expand-md > .container-md, - .navbar-expand-md > .container-lg, - .navbar-expand-md > .container-xl, - .navbar-expand-md > .container-xxl, - .navbar-expand-md > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } -} -@media (max-width: 991.98px) { - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, - .navbar-expand-lg > .container-sm, - .navbar-expand-lg > .container-md, - .navbar-expand-lg > .container-lg, - .navbar-expand-lg > .container-xl, - .navbar-expand-lg > .container-xxl, - .navbar-expand-lg > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, - .navbar-expand-lg > .container-sm, - .navbar-expand-lg > .container-md, - .navbar-expand-lg > .container-lg, - .navbar-expand-lg > .container-xl, - .navbar-expand-lg > .container-xxl, - .navbar-expand-lg > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} -@media (max-width: 1199.98px) { - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, - .navbar-expand-xl > .container-sm, - .navbar-expand-xl > .container-md, - .navbar-expand-xl > .container-lg, - .navbar-expand-xl > .container-xl, - .navbar-expand-xl > .container-xxl, - .navbar-expand-xl > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, - .navbar-expand-xl > .container-sm, - .navbar-expand-xl > .container-md, - .navbar-expand-xl > .container-lg, - .navbar-expand-xl > .container-xl, - .navbar-expand-xl > .container-xxl, - .navbar-expand-xl > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} -@media (max-width: 1599.98px) { - .navbar-expand-xxl > .container, - .navbar-expand-xxl > .container-fluid, - .navbar-expand-xxl > .container-sm, - .navbar-expand-xxl > .container-md, - .navbar-expand-xxl > .container-lg, - .navbar-expand-xxl > .container-xl, - .navbar-expand-xxl > .container-xxl, - .navbar-expand-xxl > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1600px) { - .navbar-expand-xxl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xxl > .container, - .navbar-expand-xxl > .container-fluid, - .navbar-expand-xxl > .container-sm, - .navbar-expand-xxl > .container-md, - .navbar-expand-xxl > .container-lg, - .navbar-expand-xxl > .container-xl, - .navbar-expand-xxl > .container-xxl, - .navbar-expand-xxl > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xxl .navbar-toggler { - display: none; - } -} -@media (max-width: 2599.98px) { - .navbar-expand-xxxl > .container, - .navbar-expand-xxxl > .container-fluid, - .navbar-expand-xxxl > .container-sm, - .navbar-expand-xxxl > .container-md, - .navbar-expand-xxxl > .container-lg, - .navbar-expand-xxxl > .container-xl, - .navbar-expand-xxxl > .container-xxl, - .navbar-expand-xxxl > .container-xxxl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 2600px) { - .navbar-expand-xxxl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-xxxl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xxxl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xxxl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xxxl > .container, - .navbar-expand-xxxl > .container-fluid, - .navbar-expand-xxxl > .container-sm, - .navbar-expand-xxxl > .container-md, - .navbar-expand-xxxl > .container-lg, - .navbar-expand-xxxl > .container-xl, - .navbar-expand-xxxl > .container-xxl, - .navbar-expand-xxxl > .container-xxxl { - flex-wrap: nowrap; - } - .navbar-expand-xxxl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xxxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xxxl .navbar-toggler { - display: none; - } -} -.navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl, -.navbar-expand > .container-xxl, -.navbar-expand > .container-xxxl { - padding-right: 0; - padding-left: 0; -} -.navbar-expand .navbar-nav { - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl, -.navbar-expand > .container-xxl, -.navbar-expand > .container-xxxl { - flex-wrap: nowrap; -} -.navbar-expand .navbar-nav-scroll { - overflow: visible; -} -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-text a { - color: #fff; -} -.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { - color: #fff; -} - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 6px; -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - min-height: 1px; - padding: 1.25rem; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} -.card-link + .card-link { - margin-left: 1.25rem; -} - -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} -.card-header:first-child { - border-radius: 5px 5px 0 0; -} - -.card-footer { - padding: 0.75rem 1.25rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} -.card-footer:last-child { - border-radius: 0 0 5px 5px; -} - -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; - border-radius: 5px; -} - -.card-img, -.card-img-top, -.card-img-bottom { - flex-shrink: 0; - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; -} - -.card-deck .card { - margin-bottom: 12px; -} -@media (min-width: 576px) { - .card-deck { - display: flex; - flex-flow: row wrap; - margin-right: -12px; - margin-left: -12px; - } - .card-deck .card { - flex: 1 0 0%; - margin-right: 12px; - margin-bottom: 0; - margin-left: 12px; - } -} - -.card-group > .card { - margin-bottom: 12px; -} -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.card-columns .card { - margin-bottom: 0.75rem; -} -@media (min-width: 576px) { - .card-columns { - column-count: 3; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.accordion { - overflow-anchor: none; -} -.accordion > .card { - overflow: hidden; -} -.accordion > .card:not(:last-of-type) { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.accordion > .card:not(:first-of-type) { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.accordion > .card > .card-header { - border-radius: 0; - margin-bottom: -1px; -} - -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #e9ecef; - border-radius: 6px; -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} -.breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: 0.5rem; - color: #6c757d; - content: "/"; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} -.breadcrumb-item.active { - color: #6c757d; -} - -.pagination { - display: flex; - padding-left: 0; - list-style: none; - border-radius: 6px; -} - -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #4575cf; - background-color: #fff; - border: 1px solid #dee2e6; -} -.page-link:hover { - z-index: 2; - color: #29529f; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6; -} -.page-link:focus { - z-index: 3; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25); -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.page-item:last-child .page-link { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.page-item.active .page-link { - z-index: 3; - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6; -} - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5; -} -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; -} -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; -} - -.badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 3px; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .badge { - transition: none; - } -} -a.badge:hover, a.badge:focus { - text-decoration: none; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} - -.badge-primary { - color: #fff; - background-color: #4575cf; -} -a.badge-primary:hover, a.badge-primary:focus { - color: #fff; - background-color: #2e5cb3; -} -a.badge-primary:focus, a.badge-primary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5); -} - -.badge-secondary { - color: #fff; - background-color: #6c757d; -} -a.badge-secondary:hover, a.badge-secondary:focus { - color: #fff; - background-color: #545b62; -} -a.badge-secondary:focus, a.badge-secondary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.badge-success { - color: #fff; - background-color: #28a745; -} -a.badge-success:hover, a.badge-success:focus { - color: #fff; - background-color: #1e7e34; -} -a.badge-success:focus, a.badge-success.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.badge-info { - color: #fff; - background-color: #17a2b8; -} -a.badge-info:hover, a.badge-info:focus { - color: #fff; - background-color: #117a8b; -} -a.badge-info:focus, a.badge-info.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.badge-warning { - color: #212529; - background-color: #ffc107; -} -a.badge-warning:hover, a.badge-warning:focus { - color: #212529; - background-color: #d39e00; -} -a.badge-warning:focus, a.badge-warning.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.badge-danger { - color: #fff; - background-color: #dc3545; -} -a.badge-danger:hover, a.badge-danger:focus { - color: #fff; - background-color: #bd2130; -} -a.badge-danger:focus, a.badge-danger.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.badge-light { - color: #212529; - background-color: #f8f9fa; -} -a.badge-light:hover, a.badge-light:focus { - color: #212529; - background-color: #dae0e5; -} -a.badge-light:focus, a.badge-light.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.badge-dark { - color: #fff; - background-color: #343a40; -} -a.badge-dark:hover, a.badge-dark:focus { - color: #fff; - background-color: #1d2124; -} -a.badge-dark:focus, a.badge-dark.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 0.3rem; -} -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} - -.alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 6px; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 4rem; -} -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 0.75rem 1.25rem; - color: inherit; -} - -.alert-primary { - color: #243d6c; - background-color: #dae3f5; - border-color: #cbd8f2; -} -.alert-primary hr { - border-top-color: #b7c9ed; -} -.alert-primary .alert-link { - color: #172746; -} - -.alert-secondary { - color: #383d41; - background-color: #e2e3e5; - border-color: #d6d8db; -} -.alert-secondary hr { - border-top-color: #c8cbcf; -} -.alert-secondary .alert-link { - color: #202326; -} - -.alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} -.alert-success hr { - border-top-color: #b1dfbb; -} -.alert-success .alert-link { - color: #0b2e13; -} - -.alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} -.alert-info hr { - border-top-color: #abdde5; -} -.alert-info .alert-link { - color: #062c33; -} - -.alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} -.alert-warning hr { - border-top-color: #ffe8a1; -} -.alert-warning .alert-link { - color: #533f03; -} - -.alert-danger { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} -.alert-danger hr { - border-top-color: #f1b0b7; -} -.alert-danger .alert-link { - color: #491217; -} - -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} -.alert-light hr { - border-top-color: #ececf6; -} -.alert-light .alert-link { - color: #686868; -} - -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} -.alert-dark hr { - border-top-color: #b9bbbe; -} -.alert-dark .alert-link { - color: #040505; -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} -.progress { - display: flex; - height: 1rem; - overflow: hidden; - line-height: 0; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 6px; -} - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #4575cf; - transition: width 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -.progress-bar-animated { - animation: 1s linear infinite progress-bar-stripes; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - animation: none; - } -} - -.media { - display: flex; - align-items: flex-start; -} - -.media-body { - flex: 1; -} - -.list-group { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: 6px; -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} -.list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} - -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} -.list-group-item.disabled, .list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff; -} -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #4575cf; - border-color: #4575cf; -} -.list-group-item + .list-group-item { - border-top-width: 0; -} -.list-group-item + .list-group-item.active { - margin-top: -1px; - border-top-width: 1px; -} - -.list-group-horizontal { - flex-direction: row; -} -.list-group-horizontal > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; -} -.list-group-horizontal > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; -} -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-sm > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-md > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; - } - .list-group-horizontal-lg > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-lg > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; - } - .list-group-horizontal-xl > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-xl > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 1600px) { - .list-group-horizontal-xxl { - flex-direction: row; - } - .list-group-horizontal-xxl > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 2600px) { - .list-group-horizontal-xxxl { - flex-direction: row; - } - .list-group-horizontal-xxxl > .list-group-item:first-child { - border-bottom-left-radius: 6px; - border-top-right-radius: 0; - } - .list-group-horizontal-xxxl > .list-group-item:last-child { - border-top-right-radius: 6px; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xxxl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xxxl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xxxl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -.list-group-flush { - border-radius: 0; -} -.list-group-flush > .list-group-item { - border-width: 0 0 1px; -} -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; -} - -.list-group-item-primary { - color: #243d6c; - background-color: #cbd8f2; -} -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #243d6c; - background-color: #b7c9ed; -} -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #243d6c; - border-color: #243d6c; -} - -.list-group-item-secondary { - color: #383d41; - background-color: #d6d8db; -} -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #383d41; - background-color: #c8cbcf; -} -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #383d41; - border-color: #383d41; -} - -.list-group-item-success { - color: #155724; - background-color: #c3e6cb; -} -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #155724; - background-color: #b1dfbb; -} -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #155724; - border-color: #155724; -} - -.list-group-item-info { - color: #0c5460; - background-color: #bee5eb; -} -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #0c5460; - background-color: #abdde5; -} -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460; -} - -.list-group-item-warning { - color: #856404; - background-color: #ffeeba; -} -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #856404; - background-color: #ffe8a1; -} -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #856404; - border-color: #856404; -} - -.list-group-item-danger { - color: #721c24; - background-color: #f5c6cb; -} -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #721c24; - background-color: #f1b0b7; -} -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #721c24; - border-color: #721c24; -} - -.list-group-item-light { - color: #818182; - background-color: #fdfdfe; -} -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #818182; - background-color: #ececf6; -} -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #818182; - border-color: #818182; -} - -.list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca; -} -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #1b1e21; - background-color: #b9bbbe; -} -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21; -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: 0.5; -} -.close:hover { - color: #000; - text-decoration: none; -} -.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - opacity: 0.75; -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; -} - -a.close.disabled { - pointer-events: none; -} - -.toast { - flex-basis: 350px; - max-width: 350px; - font-size: 0.875rem; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - opacity: 0; - border-radius: 0.25rem; -} -.toast:not(:last-child) { - margin-bottom: 0.75rem; -} -.toast.showing { - opacity: 1; -} -.toast.show { - display: block; - opacity: 1; -} -.toast.hide { - display: none; -} - -.toast-header { - display: flex; - align-items: center; - padding: 0.25rem 0.75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.toast-body { - padding: 0.75rem; -} - -.modal-open { - overflow: hidden; -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} -.modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} -.modal.show .modal-dialog { - transform: none; -} -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - display: flex; - max-height: calc(100% - 1rem); -} -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden; -} -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer { - flex-shrink: 0; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - 1rem); -} -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - height: min-content; - content: ""; -} -.modal-dialog-centered.modal-dialog-scrollable { - flex-direction: column; - justify-content: center; - height: 100%; -} -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none; -} -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none; -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); -} -.modal-footer > * { - margin: 0.25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - height: min-content; - } - .modal-sm { - max-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - max-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: 0.9; -} -.tooltip .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} -.tooltip .arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { - padding: 0.4rem 0; -} -.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { - bottom: 0; -} -.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { - top: 0; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} - -.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { - padding: 0 0.4rem; -} -.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { - right: 0; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { - padding: 0.4rem 0; -} -.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { - top: 0; -} -.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { - bottom: 0; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} - -.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { - padding: 0 0.4rem; -} -.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { - left: 0; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 6px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; - margin: 0 0.3rem; -} -.popover .arrow::before, .popover .arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-popover-top, .bs-popover-auto[x-placement^=top] { - margin-bottom: 0.5rem; -} -.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=top] > .arrow { - bottom: calc(-0.5rem - 1px); -} -.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=top] > .arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=top] > .arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} - -.bs-popover-right, .bs-popover-auto[x-placement^=right] { - margin-left: 0.5rem; -} -.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=right] > .arrow { - left: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} -.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=right] > .arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=right] > .arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} - -.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { - margin-top: 0.5rem; -} -.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=bottom] > .arrow { - top: calc(-0.5rem - 1px); -} -.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=bottom] > .arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=bottom] > .arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.bs-popover-left, .bs-popover-auto[x-placement^=left] { - margin-right: 0.5rem; -} -.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=left] > .arrow { - right: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} -.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=left] > .arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=left] > .arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} - -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.popover-header:empty { - display: none; -} - -.popover-body { - padding: 0.5rem 0.75rem; - color: #212529; -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left { - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: 50%/100% 100% no-repeat; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: flex; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} -.carousel-indicators li { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators li { - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} - -@keyframes spinner-border { - to { - transform: rotate(360deg); - } -} -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - border: 0.25em solid currentcolor; - border-right-color: transparent; - border-radius: 50%; - animation: 0.75s linear infinite spinner-border; -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - background-color: currentcolor; - border-radius: 50%; - opacity: 0; - animation: 0.75s linear infinite spinner-grow; -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} - -@media (prefers-reduced-motion: reduce) { - .spinner-border, - .spinner-grow { - animation-duration: 1.5s; - } -} -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.bg-primary { - background-color: #4575cf !important; -} - -a.bg-primary:hover, a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #2e5cb3 !important; -} - -.bg-secondary { - background-color: #6c757d !important; -} - -a.bg-secondary:hover, a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #545b62 !important; -} - -.bg-success { - background-color: #28a745 !important; -} - -a.bg-success:hover, a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #1e7e34 !important; -} - -.bg-info { - background-color: #17a2b8 !important; -} - -a.bg-info:hover, a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #117a8b !important; -} - -.bg-warning { - background-color: #ffc107 !important; -} - -a.bg-warning:hover, a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #d39e00 !important; -} - -.bg-danger { - background-color: #dc3545 !important; -} - -a.bg-danger:hover, a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #bd2130 !important; -} - -.bg-light { - background-color: #f8f9fa !important; -} - -a.bg-light:hover, a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #dae0e5 !important; -} - -.bg-dark { - background-color: #343a40 !important; -} - -a.bg-dark:hover, a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #1d2124 !important; -} - -.bg-white { - background-color: #fff !important; -} - -.bg-transparent { - background-color: transparent !important; -} - -.border { - border: 1px solid #dee2e6 !important; -} - -.border-top { - border-top: 1px solid #dee2e6 !important; -} - -.border-right { - border-right: 1px solid #dee2e6 !important; -} - -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} - -.border-left { - border-left: 1px solid #dee2e6 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - -.border-primary { - border-color: #4575cf !important; -} - -.border-secondary { - border-color: #6c757d !important; -} - -.border-success { - border-color: #28a745 !important; -} - -.border-info { - border-color: #17a2b8 !important; -} - -.border-warning { - border-color: #ffc107 !important; -} - -.border-danger { - border-color: #dc3545 !important; -} - -.border-light { - border-color: #f8f9fa !important; -} - -.border-dark { - border-color: #343a40 !important; -} - -.border-white { - border-color: #fff !important; -} - -.rounded-sm { - border-radius: 0.2rem !important; -} - -.rounded { - border-radius: 6px !important; -} - -.rounded-top { - border-top-left-radius: 6px !important; - border-top-right-radius: 6px !important; -} - -.rounded-right { - border-top-right-radius: 6px !important; - border-bottom-right-radius: 6px !important; -} - -.rounded-bottom { - border-bottom-right-radius: 6px !important; - border-bottom-left-radius: 6px !important; -} - -.rounded-left { - border-top-left-radius: 6px !important; - border-bottom-left-radius: 6px !important; -} - -.rounded-lg { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 1600px) { - .d-xxl-none { - display: none !important; - } - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 2600px) { - .d-xxxl-none { - display: none !important; - } - .d-xxxl-inline { - display: inline !important; - } - .d-xxxl-inline-block { - display: inline-block !important; - } - .d-xxxl-block { - display: block !important; - } - .d-xxxl-table { - display: table !important; - } - .d-xxxl-table-row { - display: table-row !important; - } - .d-xxxl-table-cell { - display: table-cell !important; - } - .d-xxxl-flex { - display: flex !important; - } - .d-xxxl-inline-flex { - display: inline-flex !important; - } -} -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } -} -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} -.embed-responsive::before { - display: block; - content: ""; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.85714286%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } -} -@media (min-width: 768px) { - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } -} -@media (min-width: 992px) { - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } -} -@media (min-width: 1200px) { - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } -} -@media (min-width: 1600px) { - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } -} -@media (min-width: 2600px) { - .flex-xxxl-row { - flex-direction: row !important; - } - .flex-xxxl-column { - flex-direction: column !important; - } - .flex-xxxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .flex-xxxl-fill { - flex: 1 1 auto !important; - } - .flex-xxxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxxl-shrink-1 { - flex-shrink: 1 !important; - } - .justify-content-xxxl-start { - justify-content: flex-start !important; - } - .justify-content-xxxl-end { - justify-content: flex-end !important; - } - .justify-content-xxxl-center { - justify-content: center !important; - } - .justify-content-xxxl-between { - justify-content: space-between !important; - } - .justify-content-xxxl-around { - justify-content: space-around !important; - } - .align-items-xxxl-start { - align-items: flex-start !important; - } - .align-items-xxxl-end { - align-items: flex-end !important; - } - .align-items-xxxl-center { - align-items: center !important; - } - .align-items-xxxl-baseline { - align-items: baseline !important; - } - .align-items-xxxl-stretch { - align-items: stretch !important; - } - .align-content-xxxl-start { - align-content: flex-start !important; - } - .align-content-xxxl-end { - align-content: flex-end !important; - } - .align-content-xxxl-center { - align-content: center !important; - } - .align-content-xxxl-between { - align-content: space-between !important; - } - .align-content-xxxl-around { - align-content: space-around !important; - } - .align-content-xxxl-stretch { - align-content: stretch !important; - } - .align-self-xxxl-auto { - align-self: auto !important; - } - .align-self-xxxl-start { - align-self: flex-start !important; - } - .align-self-xxxl-end { - align-self: flex-end !important; - } - .align-self-xxxl-center { - align-self: center !important; - } - .align-self-xxxl-baseline { - align-self: baseline !important; - } - .align-self-xxxl-stretch { - align-self: stretch !important; - } -} -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - .float-sm-right { - float: right !important; - } - .float-sm-none { - float: none !important; - } -} -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - .float-md-right { - float: right !important; - } - .float-md-none { - float: none !important; - } -} -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - .float-lg-right { - float: right !important; - } - .float-lg-none { - float: none !important; - } -} -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - .float-xl-right { - float: right !important; - } - .float-xl-none { - float: none !important; - } -} -@media (min-width: 1600px) { - .float-xxl-left { - float: left !important; - } - .float-xxl-right { - float: right !important; - } - .float-xxl-none { - float: none !important; - } -} -@media (min-width: 2600px) { - .float-xxxl-left { - float: left !important; - } - .float-xxxl-right { - float: right !important; - } - .float-xxxl-none { - float: none !important; - } -} -.user-select-all { - user-select: all !important; -} - -.user-select-auto { - user-select: auto !important; -} - -.user-select-none { - user-select: none !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: sticky !important; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -@supports (position: sticky) { - .sticky-top { - position: sticky; - top: 0; - z-index: 1020; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow { - box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75) !important; -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50, .ports-table-name { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.vw-100 { - width: 100vw !important; -} - -.vh-100 { - height: 100vh !important; -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, .sockets-table-send_oct, .sockets-table-recv_oct, .ports-table-output, -.px-4, -.apps-table-version { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, tr > :first-child, -.px-4, -.apps-table-version { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} -@media (min-width: 1600px) { - .m-xxl-0 { - margin: 0 !important; - } - .mt-xxl-0, - .my-xxl-0 { - margin-top: 0 !important; - } - .mr-xxl-0, - .mx-xxl-0 { - margin-right: 0 !important; - } - .mb-xxl-0, - .my-xxl-0 { - margin-bottom: 0 !important; - } - .ml-xxl-0, - .mx-xxl-0 { - margin-left: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .mt-xxl-1, - .my-xxl-1 { - margin-top: 0.25rem !important; - } - .mr-xxl-1, - .mx-xxl-1 { - margin-right: 0.25rem !important; - } - .mb-xxl-1, - .my-xxl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xxl-1, - .mx-xxl-1 { - margin-left: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .mt-xxl-2, - .my-xxl-2 { - margin-top: 0.5rem !important; - } - .mr-xxl-2, - .mx-xxl-2 { - margin-right: 0.5rem !important; - } - .mb-xxl-2, - .my-xxl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xxl-2, - .mx-xxl-2 { - margin-left: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .mt-xxl-3, - .my-xxl-3 { - margin-top: 1rem !important; - } - .mr-xxl-3, - .mx-xxl-3 { - margin-right: 1rem !important; - } - .mb-xxl-3, - .my-xxl-3 { - margin-bottom: 1rem !important; - } - .ml-xxl-3, - .mx-xxl-3 { - margin-left: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .mt-xxl-4, - .my-xxl-4 { - margin-top: 1.5rem !important; - } - .mr-xxl-4, - .mx-xxl-4 { - margin-right: 1.5rem !important; - } - .mb-xxl-4, - .my-xxl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xxl-4, - .mx-xxl-4 { - margin-left: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .mt-xxl-5, - .my-xxl-5 { - margin-top: 3rem !important; - } - .mr-xxl-5, - .mx-xxl-5 { - margin-right: 3rem !important; - } - .mb-xxl-5, - .my-xxl-5 { - margin-bottom: 3rem !important; - } - .ml-xxl-5, - .mx-xxl-5 { - margin-left: 3rem !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .pt-xxl-0, - .py-xxl-0 { - padding-top: 0 !important; - } - .pr-xxl-0, - .px-xxl-0 { - padding-right: 0 !important; - } - .pb-xxl-0, - .py-xxl-0 { - padding-bottom: 0 !important; - } - .pl-xxl-0, - .px-xxl-0 { - padding-left: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .pt-xxl-1, - .py-xxl-1 { - padding-top: 0.25rem !important; - } - .pr-xxl-1, - .px-xxl-1 { - padding-right: 0.25rem !important; - } - .pb-xxl-1, - .py-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xxl-1, - .px-xxl-1 { - padding-left: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .pt-xxl-2, - .py-xxl-2 { - padding-top: 0.5rem !important; - } - .pr-xxl-2, - .px-xxl-2 { - padding-right: 0.5rem !important; - } - .pb-xxl-2, - .py-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xxl-2, - .px-xxl-2 { - padding-left: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .pt-xxl-3, - .py-xxl-3 { - padding-top: 1rem !important; - } - .pr-xxl-3, - .px-xxl-3 { - padding-right: 1rem !important; - } - .pb-xxl-3, - .py-xxl-3 { - padding-bottom: 1rem !important; - } - .pl-xxl-3, - .px-xxl-3 { - padding-left: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .pt-xxl-4, - .py-xxl-4 { - padding-top: 1.5rem !important; - } - .pr-xxl-4, - .px-xxl-4 { - padding-right: 1.5rem !important; - } - .pb-xxl-4, - .py-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xxl-4, - .px-xxl-4 { - padding-left: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .pt-xxl-5, - .py-xxl-5 { - padding-top: 3rem !important; - } - .pr-xxl-5, - .px-xxl-5 { - padding-right: 3rem !important; - } - .pb-xxl-5, - .py-xxl-5 { - padding-bottom: 3rem !important; - } - .pl-xxl-5, - .px-xxl-5 { - padding-left: 3rem !important; - } - .m-xxl-n1 { - margin: -0.25rem !important; - } - .mt-xxl-n1, - .my-xxl-n1 { - margin-top: -0.25rem !important; - } - .mr-xxl-n1, - .mx-xxl-n1 { - margin-right: -0.25rem !important; - } - .mb-xxl-n1, - .my-xxl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xxl-n1, - .mx-xxl-n1 { - margin-left: -0.25rem !important; - } - .m-xxl-n2 { - margin: -0.5rem !important; - } - .mt-xxl-n2, - .my-xxl-n2 { - margin-top: -0.5rem !important; - } - .mr-xxl-n2, - .mx-xxl-n2 { - margin-right: -0.5rem !important; - } - .mb-xxl-n2, - .my-xxl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xxl-n2, - .mx-xxl-n2 { - margin-left: -0.5rem !important; - } - .m-xxl-n3 { - margin: -1rem !important; - } - .mt-xxl-n3, - .my-xxl-n3 { - margin-top: -1rem !important; - } - .mr-xxl-n3, - .mx-xxl-n3 { - margin-right: -1rem !important; - } - .mb-xxl-n3, - .my-xxl-n3 { - margin-bottom: -1rem !important; - } - .ml-xxl-n3, - .mx-xxl-n3 { - margin-left: -1rem !important; - } - .m-xxl-n4 { - margin: -1.5rem !important; - } - .mt-xxl-n4, - .my-xxl-n4 { - margin-top: -1.5rem !important; - } - .mr-xxl-n4, - .mx-xxl-n4 { - margin-right: -1.5rem !important; - } - .mb-xxl-n4, - .my-xxl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xxl-n4, - .mx-xxl-n4 { - margin-left: -1.5rem !important; - } - .m-xxl-n5 { - margin: -3rem !important; - } - .mt-xxl-n5, - .my-xxl-n5 { - margin-top: -3rem !important; - } - .mr-xxl-n5, - .mx-xxl-n5 { - margin-right: -3rem !important; - } - .mb-xxl-n5, - .my-xxl-n5 { - margin-bottom: -3rem !important; - } - .ml-xxl-n5, - .mx-xxl-n5 { - margin-left: -3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mt-xxl-auto, - .my-xxl-auto { - margin-top: auto !important; - } - .mr-xxl-auto, - .mx-xxl-auto { - margin-right: auto !important; - } - .mb-xxl-auto, - .my-xxl-auto { - margin-bottom: auto !important; - } - .ml-xxl-auto, - .mx-xxl-auto { - margin-left: auto !important; - } -} -@media (min-width: 2600px) { - .m-xxxl-0 { - margin: 0 !important; - } - .mt-xxxl-0, - .my-xxxl-0 { - margin-top: 0 !important; - } - .mr-xxxl-0, - .mx-xxxl-0 { - margin-right: 0 !important; - } - .mb-xxxl-0, - .my-xxxl-0 { - margin-bottom: 0 !important; - } - .ml-xxxl-0, - .mx-xxxl-0 { - margin-left: 0 !important; - } - .m-xxxl-1 { - margin: 0.25rem !important; - } - .mt-xxxl-1, - .my-xxxl-1 { - margin-top: 0.25rem !important; - } - .mr-xxxl-1, - .mx-xxxl-1 { - margin-right: 0.25rem !important; - } - .mb-xxxl-1, - .my-xxxl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xxxl-1, - .mx-xxxl-1 { - margin-left: 0.25rem !important; - } - .m-xxxl-2 { - margin: 0.5rem !important; - } - .mt-xxxl-2, - .my-xxxl-2 { - margin-top: 0.5rem !important; - } - .mr-xxxl-2, - .mx-xxxl-2 { - margin-right: 0.5rem !important; - } - .mb-xxxl-2, - .my-xxxl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xxxl-2, - .mx-xxxl-2 { - margin-left: 0.5rem !important; - } - .m-xxxl-3 { - margin: 1rem !important; - } - .mt-xxxl-3, - .my-xxxl-3 { - margin-top: 1rem !important; - } - .mr-xxxl-3, - .mx-xxxl-3 { - margin-right: 1rem !important; - } - .mb-xxxl-3, - .my-xxxl-3 { - margin-bottom: 1rem !important; - } - .ml-xxxl-3, - .mx-xxxl-3 { - margin-left: 1rem !important; - } - .m-xxxl-4 { - margin: 1.5rem !important; - } - .mt-xxxl-4, - .my-xxxl-4 { - margin-top: 1.5rem !important; - } - .mr-xxxl-4, - .mx-xxxl-4 { - margin-right: 1.5rem !important; - } - .mb-xxxl-4, - .my-xxxl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xxxl-4, - .mx-xxxl-4 { - margin-left: 1.5rem !important; - } - .m-xxxl-5 { - margin: 3rem !important; - } - .mt-xxxl-5, - .my-xxxl-5 { - margin-top: 3rem !important; - } - .mr-xxxl-5, - .mx-xxxl-5 { - margin-right: 3rem !important; - } - .mb-xxxl-5, - .my-xxxl-5 { - margin-bottom: 3rem !important; - } - .ml-xxxl-5, - .mx-xxxl-5 { - margin-left: 3rem !important; - } - .p-xxxl-0 { - padding: 0 !important; - } - .pt-xxxl-0, - .py-xxxl-0 { - padding-top: 0 !important; - } - .pr-xxxl-0, - .px-xxxl-0 { - padding-right: 0 !important; - } - .pb-xxxl-0, - .py-xxxl-0 { - padding-bottom: 0 !important; - } - .pl-xxxl-0, - .px-xxxl-0 { - padding-left: 0 !important; - } - .p-xxxl-1 { - padding: 0.25rem !important; - } - .pt-xxxl-1, - .py-xxxl-1 { - padding-top: 0.25rem !important; - } - .pr-xxxl-1, - .px-xxxl-1 { - padding-right: 0.25rem !important; - } - .pb-xxxl-1, - .py-xxxl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xxxl-1, - .px-xxxl-1 { - padding-left: 0.25rem !important; - } - .p-xxxl-2 { - padding: 0.5rem !important; - } - .pt-xxxl-2, - .py-xxxl-2 { - padding-top: 0.5rem !important; - } - .pr-xxxl-2, - .px-xxxl-2 { - padding-right: 0.5rem !important; - } - .pb-xxxl-2, - .py-xxxl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xxxl-2, - .px-xxxl-2 { - padding-left: 0.5rem !important; - } - .p-xxxl-3 { - padding: 1rem !important; - } - .pt-xxxl-3, - .py-xxxl-3 { - padding-top: 1rem !important; - } - .pr-xxxl-3, - .px-xxxl-3 { - padding-right: 1rem !important; - } - .pb-xxxl-3, - .py-xxxl-3 { - padding-bottom: 1rem !important; - } - .pl-xxxl-3, - .px-xxxl-3 { - padding-left: 1rem !important; - } - .p-xxxl-4 { - padding: 1.5rem !important; - } - .pt-xxxl-4, - .py-xxxl-4 { - padding-top: 1.5rem !important; - } - .pr-xxxl-4, - .px-xxxl-4 { - padding-right: 1.5rem !important; - } - .pb-xxxl-4, - .py-xxxl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xxxl-4, - .px-xxxl-4 { - padding-left: 1.5rem !important; - } - .p-xxxl-5 { - padding: 3rem !important; - } - .pt-xxxl-5, - .py-xxxl-5 { - padding-top: 3rem !important; - } - .pr-xxxl-5, - .px-xxxl-5 { - padding-right: 3rem !important; - } - .pb-xxxl-5, - .py-xxxl-5 { - padding-bottom: 3rem !important; - } - .pl-xxxl-5, - .px-xxxl-5 { - padding-left: 3rem !important; - } - .m-xxxl-n1 { - margin: -0.25rem !important; - } - .mt-xxxl-n1, - .my-xxxl-n1 { - margin-top: -0.25rem !important; - } - .mr-xxxl-n1, - .mx-xxxl-n1 { - margin-right: -0.25rem !important; - } - .mb-xxxl-n1, - .my-xxxl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xxxl-n1, - .mx-xxxl-n1 { - margin-left: -0.25rem !important; - } - .m-xxxl-n2 { - margin: -0.5rem !important; - } - .mt-xxxl-n2, - .my-xxxl-n2 { - margin-top: -0.5rem !important; - } - .mr-xxxl-n2, - .mx-xxxl-n2 { - margin-right: -0.5rem !important; - } - .mb-xxxl-n2, - .my-xxxl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xxxl-n2, - .mx-xxxl-n2 { - margin-left: -0.5rem !important; - } - .m-xxxl-n3 { - margin: -1rem !important; - } - .mt-xxxl-n3, - .my-xxxl-n3 { - margin-top: -1rem !important; - } - .mr-xxxl-n3, - .mx-xxxl-n3 { - margin-right: -1rem !important; - } - .mb-xxxl-n3, - .my-xxxl-n3 { - margin-bottom: -1rem !important; - } - .ml-xxxl-n3, - .mx-xxxl-n3 { - margin-left: -1rem !important; - } - .m-xxxl-n4 { - margin: -1.5rem !important; - } - .mt-xxxl-n4, - .my-xxxl-n4 { - margin-top: -1.5rem !important; - } - .mr-xxxl-n4, - .mx-xxxl-n4 { - margin-right: -1.5rem !important; - } - .mb-xxxl-n4, - .my-xxxl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xxxl-n4, - .mx-xxxl-n4 { - margin-left: -1.5rem !important; - } - .m-xxxl-n5 { - margin: -3rem !important; - } - .mt-xxxl-n5, - .my-xxxl-n5 { - margin-top: -3rem !important; - } - .mr-xxxl-n5, - .mx-xxxl-n5 { - margin-right: -3rem !important; - } - .mb-xxxl-n5, - .my-xxxl-n5 { - margin-bottom: -3rem !important; - } - .ml-xxxl-n5, - .mx-xxxl-n5 { - margin-left: -3rem !important; - } - .m-xxxl-auto { - margin: auto !important; - } - .mt-xxxl-auto, - .my-xxxl-auto { - margin-top: auto !important; - } - .mr-xxxl-auto, - .mx-xxxl-auto { - margin-right: auto !important; - } - .mb-xxxl-auto, - .my-xxxl-auto { - margin-bottom: auto !important; - } - .ml-xxxl-auto, - .mx-xxxl-auto { - margin-left: auto !important; - } -} -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ""; - background-color: rgba(0, 0, 0, 0); -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify { - text-align: justify !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} -@media (min-width: 1600px) { - .text-xxl-left { - text-align: left !important; - } - .text-xxl-right { - text-align: right !important; - } - .text-xxl-center { - text-align: center !important; - } -} -@media (min-width: 2600px) { - .text-xxxl-left { - text-align: left !important; - } - .text-xxxl-right { - text-align: right !important; - } - .text-xxxl-center { - text-align: center !important; - } -} -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-light { - font-weight: 300 !important; -} - -.font-weight-lighter { - font-weight: lighter !important; -} - -.font-weight-normal { - font-weight: 400 !important; -} - -.font-weight-bold { - font-weight: 700 !important; -} - -.font-weight-bolder { - font-weight: bolder !important; -} - -.font-italic { - font-style: italic !important; -} - -.text-white { - color: #fff !important; -} - -.text-primary { - color: #4575cf !important; -} - -a.text-primary:hover, a.text-primary:focus { - color: #29529f !important; -} - -.text-secondary { - color: #6c757d !important; -} - -a.text-secondary:hover, a.text-secondary:focus { - color: #494f54 !important; -} - -.text-success { - color: #28a745 !important; -} - -a.text-success:hover, a.text-success:focus { - color: #19692c !important; -} - -.text-info { - color: #17a2b8 !important; -} - -a.text-info:hover, a.text-info:focus { - color: #0f6674 !important; -} - -.text-warning { - color: #ffc107 !important; -} - -a.text-warning:hover, a.text-warning:focus { - color: #ba8b00 !important; -} - -.text-danger { - color: #dc3545 !important; -} - -a.text-danger:hover, a.text-danger:focus { - color: #a71d2a !important; -} - -.text-light { - color: #f8f9fa !important; -} - -a.text-light:hover, a.text-light:focus { - color: #cbd3da !important; -} - -.text-dark { - color: #343a40 !important; -} - -a.text-dark:hover, a.text-dark:focus { - color: #121416 !important; -} - -.text-body { - color: #212529 !important; -} - -.text-muted { - color: rgba(85, 91, 104, 0.5) !important; -} - -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-break { - word-break: break-word !important; - word-wrap: break-word !important; -} - -.text-reset { - color: inherit !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -@media print { - *, - *::before, - *::after { - text-shadow: none !important; - box-shadow: none !important; - } - a:not(.btn) { - text-decoration: underline; - } - abbr[title]::after { - content: " (" attr(title) ")"; - } - pre { - white-space: pre-wrap !important; - } - pre, - blockquote { - border: 1px solid #adb5bd; - page-break-inside: avoid; - } - tr, - img { - page-break-inside: avoid; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - @page { - size: a3; - } - body { - min-width: 992px !important; - } - .container { - min-width: 992px !important; - } - .navbar { - display: none; - } - .badge { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6 !important; - } - .table-dark { - color: inherit; - } - .table-dark th, - .table-dark td, - .table-dark thead th, - .table-dark tbody + tbody { - border-color: #dee2e6; - } - .table .thead-dark th { - color: inherit; - border-color: #dee2e6; - } -} -html { - height: 100%; - background-color: #dae0ee; -} - -body { - background-color: #dae0ee; - background: linear-gradient(-15deg, #dae0ee, #ebeff6); - background-size: cover; - background-repeat: repeat-x; - color: #555b68; - font-size: 16px; - line-height: 1.5; - height: 100%; -} - -#main { - padding-top: 3.5rem; - position: relative; -} - -.layout-wrapper { - min-height: 100%; -} - -.progress { - border-radius: 0.5rem; -} - -tr[phx-click] { - cursor: pointer; -} - -table.table-hover tbody tr:hover { - background-color: #f2f4f9; -} - -/* - * `dash-table` adds extra styling on top of regular Bootstrap table css. - * - * `.dash-table-wrapper` can be used to add horizontal scrolling: - * - * ``` - *
- * - * ... - *
- *
- * ``` - * - */ -.dash-table { - color: #4e5156; - margin-bottom: 0; -} -.dash-table th { - background-color: #f2f4f9; - white-space: nowrap; -} -.dash-table .dash-table-icon { - padding-left: 0.25rem; - display: inline-block; -} -.dash-table .icon-sort { - display: inline-block; - width: 0; - height: 0; - line-height: 6px; - position: relative; - top: -1px; - vertical-align: middle; -} -.dash-table .icon-asc { - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #71747c; -} -.dash-table .icon-desc { - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-top: 6px solid #71747c; -} - -.dash-table-wrapper { - border-radius: 6px 6px 0 0; - overflow-x: auto; -} - -.app-info { - overflow: auto; -} -.app-info .node { - fill: #f2f4f9; - stroke: #e6eaf3; - stroke-width: 1; -} -.app-info .node:hover { - cursor: pointer; - fill: #e6eaf3; -} -.app-info .node:hover + .tree-node-text { - fill: #3d3f43; -} -.app-info .line { - stroke: #e6eaf3; - stroke-width: 2; -} -.app-info .tree { - position: relative; - margin: 20px 0; -} -.app-info .tree-node-text { - fill: #555b68; - font-size: 14px; - font-family: "LiveDashboardFont"; - pointer-events: none; -} - -#elixir-card { - background: linear-gradient(40deg, #754fa2, #6979db); - color: #fff; -} - -#phoenix-card { - background: linear-gradient(40deg, #f26d40, #dfa843); - color: #fff; -} - -#app-card { - background: linear-gradient(40deg, #4575cf, #36a4ee); - color: #fff; -} - -.bg-green { - background-color: #4db167; -} - -.bg-blue { - background-color: #5d89c7; -} - -.bg-purple { - background-color: #754fa2; -} - -.bg-yellow { - background-color: #f9bc14; -} - -.bg-orange { - background-color: #f26d40; -} - -.bg-dark-gray { - background-color: #9498a2; -} - -.bg-light-gray { - background-color: #eceff6; -} - -.bg-card-default { - background-color: #ffffff; -} - -.bg-gradient-green { - background: linear-gradient(40deg, #4db167, #70c185); -} - -.bg-gradient-blue { - background: linear-gradient(40deg, #5d89c7, #83a5d4); -} - -.bg-gradient-purple { - background: linear-gradient(40deg, #754fa2, #8f6cb8); -} - -.bg-gradient-yellow { - background: linear-gradient(40deg, #f9bc14, #faca46); -} - -.bg-gradient-orange { - background: linear-gradient(40deg, #f26d40, #f58a66); -} - -.bg-gradient-dark-gray { - background: linear-gradient(40deg, #9498a2, #afb2ba); -} - -.bg-gradient-light-gray { - background: linear-gradient(40deg, #eceff6, #f3f5f9); -} - -.banner-card { - border-radius: 6px; - box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75); - background-color: #fff; - padding: 1rem; -} - -.banner-card-title { - margin-bottom: 0.2rem; -} - -.banner-card-value { - font-size: 1.5rem; - font-weight: bold; - margin-bottom: -0.15rem; -} - -#system-info-card .banner-card-value { - font-size: 16px; - font-weight: 400; - padding: 0.3rem; -} - -.btn.btn-primary { - background-color: #756f9a; - border-width: 0; -} -.btn.btn-primary:not(:disabled):not(.disabled):active { - background-color: #474360; -} - -.btn.btn-secondary { - background-color: #8b8b8b; - border-width: 0; -} - -.card { - border-radius: 6px; - box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75); - border: none; -} - -.card-title { - margin-bottom: 0.75rem; -} -.card-title .badge { - font-weight: inherit; -} - -.card-usage { - padding-top: 12px; - padding-bottom: 12px; -} - -.charts-col { - margin-bottom: 2rem; -} -.charts-col .card { - padding: 0.5rem; -} -.charts-col .card .hint { - position: absolute; - right: 14px; -} -.charts-col .card .uplot { - font-family: "LiveDashboardFont"; - max-width: 100%; -} -.charts-col .card .uplot.summary .legend tr:nth-child(n+3) { - display: table-row; -} -.charts-col .card .uplot .title { - font-weight: 900; - margin-bottom: 0.75rem; -} -.charts-col .card .uplot .legend { - margin-top: 1.75rem; - font-size: 0.75rem; - width: 100%; - table-layout: fixed; -} -.charts-col .card .uplot .legend .labels { - background-color: #f2f4f9; - color: #71747c; -} -.charts-col .card .uplot .legend .labels th { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - min-width: 0; - text-align: center; - /* this padding is missing from uPlot css */ - padding: 4px; -} -.charts-col .card .uplot .legend .series th { - text-align: left; -} -.charts-col .card .uplot .legend .series td { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - min-width: 0; -} -.charts-col .card .uplot .legend.inline { - display: flex; - flex-wrap: wrap; - text-align: left; - margin-top: 0; -} -.charts-col .card .uplot .legend.inline .series { - display: flex; - flex-basis: 45%; - order: 10; -} -.charts-col .card .uplot .legend.inline .series th { - align-items: center; - display: flex; - flex-basis: 55px; -} -.charts-col .card .uplot .legend.inline .series:first-child { - background-color: #f2f4f9; - color: #71747c; - flex-basis: 100%; - margin: 1.75rem 0 0.5rem 0; - order: 1; - text-align: center; - display: inline-block; -} -.charts-col .card .uplot .legend.inline .series:first-child th { - display: inline-block; -} -.charts-col .card .uplot .legend.inline .series:first-child .ident { - display: none; -} -.charts-col .card .uplot .legend.inline .series:nth-child(2) { - order: 2; -} -.charts-col .card .uplot .legend.inline .series:nth-child(5) { - order: 4; -} -.charts-col .card .uplot .legend.inline .series:nth-child(3) { - order: 3; -} - -@media (min-width: 1600px) { - [data-phx-view="LiveDashboard.MetricsLive"] #main.container { - max-width: 95%; - } - [data-phx-view="LiveDashboard.MetricsLive"] #main.container .charts-nav { - max-width: 1140px; - } -} -.code-field { - background-color: #f2f4f9; - color: #9498a2; - border-radius: 6px; - border-width: 0; - font-weight: 100; - padding: 0.5rem 0.75rem; - white-space: nowrap; - width: 100%; - resize: none; - overflow: auto; - margin-bottom: 0.75rem; - scrollbar-width: none; -} -.code-field:focus { - outline: none; -} -.code-field::-webkit-scrollbar { - display: none; -} - -.cookie-status { - display: inline-block; - padding: 0.35rem 0 0.25rem 0; - transition: all 0.3s ease-out; - padding-left: 18px; - position: relative; - opacity: 0; -} -.cookie-status[data-enabled] { - opacity: 0.75; -} -.cookie-status::before { - background-color: #df0606; - content: ""; - display: block; - height: 10px; - width: 10px; - border-radius: 50px; - top: 0.82rem; - left: 0; - position: absolute; - animation-name: pulse; - animation-iteration-count: infinite; - animation-duration: 1.2s; - animation-timing-function: ease-in-out; -} - -@keyframes pulse { - 0% { - opacity: 1; - } - 45% { - opacity: 1; - } - 50% { - opacity: 0; - } - 95% { - opacity: 0; - } -} -.copy-indicator { - opacity: 0; - padding: 0.375rem 0.75rem; - display: inline-block; -} -.copy-indicator[data-enabled] { - animation-name: blink; - animation-duration: 1.5s; - animation-timing-function: ease-out; -} - -@keyframes blink { - 0% { - opacity: 0; - } - 20% { - opacity: 1; - } - 60% { - opacity: 1; - } - 100% { - opacity: 0; - } -} -.fields-card dl { - margin-bottom: 0; -} -.fields-card dl .code-field { - margin-bottom: 0.25rem; -} -.fields-card dl dd:last-child { - margin-bottom: 0; -} -.fields-card dl dd:last-child .code-field { - margin-bottom: 0; -} - -header { - background: #4a4473; - position: relative; -} -header h1 { - text-shadow: 2px 2px 0 rgba(23, 31, 50, 0.5); - color: #eceff6; - font-size: 1.75rem; - margin-top: 2.75rem; - margin-bottom: 0; -} -header .container { - position: relative; - z-index: 3; -} - -#menu-bar { - margin-top: auto; - box-shadow: 0 2px 5px rgba(201, 209, 230, 0.15), 0 7px 20px rgba(201, 209, 230, 0.3); - border-radius: 6px; - background-color: #fff; - display: inline-block; - padding: 0 0.75rem; - margin-top: 1rem; - margin-bottom: -1.5rem; - position: relative; - width: 100%; -} -#menu-bar .menu-item { - display: inline-block; - padding: 0.75rem; - position: relative; - text-decoration: none; - color: rgba(69, 117, 207, 0.75); -} -#menu-bar .menu-item:hover { - color: #3d2954; -} -#menu-bar .menu-item.active { - color: #3d2954; - text-shadow: 1px 1px rgba(69, 117, 207, 0.1); -} -#menu-bar .menu-item-disabled { - color: rgba(85, 91, 104, 0.5); -} -#menu-bar .menu-item-disabled:hover { - color: rgba(85, 91, 104, 0.5); -} -#menu-bar .menu-item-enable-button { - background-color: #756f9a; - border-radius: 3px; - color: #ededed; - position: absolute; - font-size: 0.75rem; - right: 50%; - bottom: -15px; - padding: 0.15rem 0.5rem; - transform: translateX(50%); -} -#menu-bar .menu-item-enable-button:hover { - background-color: #837ea5; - text-decoration: none; -} - -#nav-dropdowns { - position: absolute; - top: 0rem; - right: 0rem; - padding-top: 0.25rem; - padding-right: 0.75rem; - font-size: 0.9rem; -} -#nav-dropdowns form { - margin: 0.5em 0; - justify-content: flex-end; - display: flex; - flex-flow: row wrap; -} -#nav-dropdowns label { - color: #dae0ee; - margin: 0 0.5rem 0 0; - line-height: 1.9rem; - display: flex; -} -#nav-dropdowns label.no-select { - margin: 0; -} -#nav-dropdowns .custom-select { - background-color: rgba(218, 224, 238, 0.75); - border-radius: 6px; - border-width: 0; - color: black; - width: auto; -} - -@media (max-width: 768px) { - header h1 { - font-size: 1.25rem; - margin-top: 1.25rem; - } - #menu-bar { - padding: 0 0.5rem; - margin-top: 0; - } - #menu-bar .menu-item { - padding: 0.75rem 0.5rem; - } - #nav-dropdowns { - position: relative; - text-align: center; - width: 100%; - padding: 0; - margin-bottom: 0.4rem; - } - #nav-dropdowns form { - justify-content: flex-start; - } - #nav-dropdowns label { - line-height: 1rem; - margin-bottom: 0.25rem; - } - #nav-dropdowns .custom-select { - width: 100%; - } -} -footer { - text-align: center; - padding: 1.5rem 0; -} -footer img { - width: 16px; - margin: 0 3px 3px 0; -} -footer .footer-dashbit { - padding-left: 0.125rem; -} - -.hint { - display: inline-block; - position: relative; -} -.hint .hint-text { - box-shadow: 0 2px 5px rgba(23, 31, 50, 0.15), 0 7px 20px rgba(201, 209, 230, 0.3); - display: none; -} -.hint .hint-icon { - cursor: help; - height: 15px; - width: 15px; - position: relative; - top: -1px; -} -.hint:hover .hint-text { - border: 1px solid #b7bcc8; - border-radius: 6px; - background-color: #f2f4f9; - color: #71747c; - display: block; - position: absolute; - transform: translateX(-50%); - font-size: 1rem; - bottom: 30px; - left: 18px; - width: 300px; - padding: 1rem 1.5rem; - z-index: 10; -} -.hint .hint-icon-fill { - fill: #b7bcc8; -} -.hint .hint-icon-stroke { - stroke: #b7bcc8; -} - -.card-title .hint .hint-icon-fill { - fill: #9498a2; -} -.card-title .hint .hint-icon-stroke { - stroke: #9498a2; -} - -@media (max-width: 576px) { - .hint:hover .hint-text { - transform: none; - left: 0; - } -} -.logs-card { - display: none; -} -.logs-card[data-messages-present=true] { - display: block; -} -.logs-card #logger-messages { - overflow-y: scroll; - height: 350px; -} -.logs-card #logger-messages pre { - color: #555b68; - margin-bottom: 0; - padding: 0.25rem; - font-size: 0.75rem; -} -.logs-card #logger-messages pre:hover { - background-color: rgba(237, 237, 237, 0.5); -} -.logs-card #logger-messages pre.log-level-debug { - color: rgba(85, 91, 104, 0.75); -} - -.tabular-column-name, td.sockets-table-port, .processes-table-current_function, .processes-table-name_or_initial_call { - padding-right: 0; - max-width: 350px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.tabular-column-id, td.sockets-table-port, .ports-table-port { - color: #71747c; -} -.tabular-column-bytes, td.sockets-table-send_oct, td.sockets-table-recv_oct, .ports-table-output, td.ports-table-input, .ets-table-memory { - text-align: right; - white-space: nowrap; -} -.tabular-search { - float: right; -} -.tabular-search ::placeholder { - color: #b7bcc8; -} - -.custom-select { - background-color: #dae0ee; - border-radius: 6px; - border-width: 0; -} - -@media (max-width: 992px) { - .tabular { - font-size: 0.85rem; - } - .tabular-card { - border-radius: 0; - margin-left: -2rem; - margin-right: -2rem; - } - .tabular-column-name, td.sockets-table-port, .processes-table-current_function, .processes-table-name_or_initial_call { - max-width: 150px; - } -} -.table-hover .active { - color: #212529; - background-color: rgba(0, 0, 0, 0.075); -} - -.dash-modal { - display: block; - overflow-y: auto; - background-color: rgba(49, 50, 53, 0.5); -} -.dash-modal pre { - margin-bottom: 0; - overflow-x: auto; - white-space: pre-wrap; - word-break: break-word; -} -.dash-modal .modal-dialog { - max-width: 900px; -} -.dash-modal .modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; -} -.dash-modal .modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: none; -} -.dash-modal .modal-fullscreen .modal-header { - border-radius: none; -} -.dash-modal .modal-fullscreen .modal-body { - overflow-y: auto; -} -.dash-modal .modal-header { - background-color: #f2f4f9; - border-bottom: 2px solid #dae0ee; - padding: 1rem 1.5rem; -} -.dash-modal .modal-header h6 { - font-weight: 700; -} -.dash-modal .modal-content .modal-action { - padding: 1rem; - margin: -1rem -1rem -1rem auto; - line-height: 1; -} -.dash-modal .modal-content .modal-action-item { - display: inline-block; - color: #aaa; - font-size: 1.5rem; - vertical-align: middle; - font-weight: bold; - text-align: right; -} -.dash-modal .modal-content .modal-action-item:hover, .dash-modal .modal-content .modal-action-item:focus { - color: black; - text-decoration: none; - cursor: pointer; -} -.dash-modal .modal-content .modal-action-hidden { - display: none; -} - -@media (max-width: 992px) { - .dash-modal .modal-dialog { - max-width: 700px; - } -} -.nav-bar { - background-color: #dae0ee; - border-radius: 6px; - line-height: 1.6; -} - -.nav-bar .nav-link { - color: #4e5156; -} -.nav-bar .nav-link:hover { - color: #3d2954; -} - -.nav-bar .nav-link.active { - color: #3d2954; - border-bottom: 3px solid #756f9a; -} - -.color-bar-progress { - border-radius: 2px; - height: 1.5rem; - background-color: transparent; - position: relative; -} -.color-bar-progress-title { - color: #9498a2; - position: absolute; - right: 6px; - top: 2px; - font-weight: bold; -} -.color-bar-progress-bar { - border-color: white; - border-style: solid; - border-width: 0 1px; - min-width: 4px; - flex-grow: 0; - user-select: none; - cursor: pointer; -} -.color-bar-progress-bar[data-empty=true] { - display: none; -} -.color-bar-progress-bar[data-muted=true] { - opacity: 0.15; -} -.color-bar-progress-bar.bg-gradient-light-gray[data-muted=false] { - box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15); - background: linear-gradient(90deg, #e2e6f1, #e9ecf4); -} -.color-bar-progress-bar.bg-gradient-light-gray[data-muted=true] { - opacity: 1; - background: linear-gradient(90deg, #f6f8fb, #f3f5f9); -} -.color-bar-progress-bar:last-of-type { - border-right-width: 0; -} -.color-bar-progress-bar:first-of-type { - border-left-width: 0; - min-width: 3px; -} -.color-bar-progress-bar:hover { - box-shadow: inset 0 0 0 1px rgba(78, 81, 86, 0.25), inset 0 0 0 3px rgba(242, 244, 249, 0.15); - filter: contrast(120%) brightness(90%); -} -.color-bar-progress-bar:hover[data-muted=true] { - opacity: 0.6; -} -.color-bar-progress-bar.bg-gradient-light-gray:hover, .color-bar-progress-bar:hover .bg-light-gray { - box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15); - filter: none; -} - -.color-bar-legend-color { - border-radius: 3px; - display: inline-block; - height: 16px; - width: 16px; -} -.color-bar-legend-entry { - user-select: none; - cursor: pointer; -} -.color-bar-legend-entry[data-muted=true] { - opacity: 0.15; -} -.color-bar-legend-entry[data-muted=false] .bg-light-gray { - box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15); -} -.color-bar-legend-entry:hover { - box-shadow: none; - filter: contrast(120%) brightness(90%); -} -.color-bar-legend-entry:hover[data-muted=true] { - opacity: 0.6; -} -.color-bar-legend-entry.bg-gradient-light-gray:hover, .color-bar-legend-entry:hover .bg-light-gray { - box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15); - filter: none; -} - -.layered-graph .connection-line { - stroke: #dae0ee; - fill: #dae0ee; - stroke-width: 1; -} -.layered-graph .node-label, .layered-graph .node-detail { - fill: #ffffff; - font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - text-anchor: middle; -} -.layered-graph .card-body { - overflow-x: auto; -} - -.resource-usage-total { - background-color: #f2f4f9; - color: #71747c; -} -.resource-usage-total-value { - color: #555b68; -} - -.tabular-info .tabular-info-not-exists { - border-radius: 6px; - color: white; - background-color: #9498a2; - padding: 1rem 1.5rem; -} -.tabular-info .tabular-info-table td:empty::after, .tabular-info .tabular-info-table pre:empty::after { - font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - content: "---"; - opacity: 0.5; - font-size: 1rem; -} -.tabular-info .tabular-info-table td:first-child { - font-weight: 700; -} -.tabular-info .tabular-info-table td:last-child { - width: 70%; -} - -/* Apps */ -/* ETS */ -/* Ports */ -/* Processes */ -/* Sockets */ -/* LiveView specific classes for your customizations */ -.phx-click-loading { - opacity: 0.5; - transition: opacity 1s ease-out; -} - -.phx-disconnected { - cursor: wait; -} - -.phx-disconnected * { - pointer-events: none; -} + */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #4575cf;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--breakpoint-xxl: 1600px;--breakpoint-xxxl: 2600px;--font-family-sans-serif: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#4575cf;text-decoration:none;background-color:rgba(0,0,0,0)}a:hover{color:#29529f;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:rgba(85,91,104,.5);text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:6px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:12px;padding-left:12px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1600px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1300px}}@media(min-width: 2600px){.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1500px}}.row{display:flex;flex-wrap:wrap;margin-right:-12px;margin-left:-12px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xxxl,.col-xxxl-auto,.col-xxxl-12,.col-xxxl-11,.col-xxxl-10,.col-xxxl-9,.col-xxxl-8,.col-xxxl-7,.col-xxxl-6,.col-xxxl-5,.col-xxxl-4,.col-xxxl-3,.col-xxxl-2,.col-xxxl-1,.col-xxl,.col-xxl-auto,.col-xxl-12,.col-xxl-11,.col-xxl-10,.col-xxl-9,.col-xxl-8,.col-xxl-7,.col-xxl-6,.col-xxl-5,.col-xxl-4,.col-xxl-3,.col-xxl-2,.col-xxl-1,.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:12px;padding-left:12px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}@media(min-width: 1600px){.col-xxl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xxl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xxl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xxl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xxl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xxl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xxl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xxl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xxl-3{flex:0 0 25%;max-width:25%}.col-xxl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xxl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xxl-6{flex:0 0 50%;max-width:50%}.col-xxl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xxl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xxl-9{flex:0 0 75%;max-width:75%}.col-xxl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xxl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xxl-12{flex:0 0 100%;max-width:100%}.order-xxl-first{order:-1}.order-xxl-last{order:13}.order-xxl-0{order:0}.order-xxl-1{order:1}.order-xxl-2{order:2}.order-xxl-3{order:3}.order-xxl-4{order:4}.order-xxl-5{order:5}.order-xxl-6{order:6}.order-xxl-7{order:7}.order-xxl-8{order:8}.order-xxl-9{order:9}.order-xxl-10{order:10}.order-xxl-11{order:11}.order-xxl-12{order:12}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}}@media(min-width: 2600px){.col-xxxl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xxxl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xxxl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xxxl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xxxl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xxxl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xxxl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xxxl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xxxl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xxxl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xxxl-3{flex:0 0 25%;max-width:25%}.col-xxxl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xxxl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xxxl-6{flex:0 0 50%;max-width:50%}.col-xxxl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xxxl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xxxl-9{flex:0 0 75%;max-width:75%}.col-xxxl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xxxl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xxxl-12{flex:0 0 100%;max-width:100%}.order-xxxl-first{order:-1}.order-xxxl-last{order:13}.order-xxxl-0{order:0}.order-xxxl-1{order:1}.order-xxxl-2{order:2}.order-xxxl-3{order:3}.order-xxxl-4{order:4}.order-xxxl-5{order:5}.order-xxxl-6{order:6}.order-xxxl-7{order:7}.order-xxxl-8{order:8}.order-xxxl-9{order:9}.order-xxxl-10{order:10}.order-xxxl-11{order:11}.order-xxxl-12{order:12}.offset-xxxl-0{margin-left:0}.offset-xxxl-1{margin-left:8.33333333%}.offset-xxxl-2{margin-left:16.66666667%}.offset-xxxl-3{margin-left:25%}.offset-xxxl-4{margin-left:33.33333333%}.offset-xxxl-5{margin-left:41.66666667%}.offset-xxxl-6{margin-left:50%}.offset-xxxl-7{margin-left:58.33333333%}.offset-xxxl-8{margin-left:66.66666667%}.offset-xxxl-9{margin-left:75%}.offset-xxxl-10{margin-left:83.33333333%}.offset-xxxl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#cbd8f2}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#9eb7e6}.table-hover .table-primary:hover{background-color:#b7c9ed}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b7c9ed}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}@media(max-width: 1599.98px){.table-responsive-xxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxl>.table-bordered{border:0}}@media(max-width: 2599.98px){.table-responsive-xxxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxxl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:6px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:rgba(0,0,0,0);border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#aac0e9;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{appearance:none}select.form-control:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:rgba(85,91,104,.5)}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:6px}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#28a745;padding-right:calc(1.5em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#28a745}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#28a745}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#28a745}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:6px}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#dc3545}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:3px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-primary:hover{color:#fff;background-color:#3162bd;border-color:#2e5cb3}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#3162bd;border-color:#2e5cb3;box-shadow:0 0 0 .2rem rgba(97,138,214,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2e5cb3;border-color:#2c57a9}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,138,214,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#4575cf;border-color:#4575cf}.btn-outline-primary:hover{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#4575cf;background-color:rgba(0,0,0,0)}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:rgba(0,0,0,0)}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:rgba(0,0,0,0)}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:rgba(0,0,0,0)}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:rgba(0,0,0,0)}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:rgba(0,0,0,0)}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:rgba(0,0,0,0)}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#4575cf;text-decoration:none}.btn-link:hover{color:#29529f;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:6px}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}@media(min-width: 1600px){.dropdown-menu-xxl-left{right:auto;left:0}.dropdown-menu-xxl-right{right:0;left:auto}}@media(min-width: 2600px){.dropdown-menu-xxxl-left{right:auto;left:0}.dropdown-menu-xxxl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#4575cf}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:6px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#4575cf;background-color:#4575cf}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#aac0e9}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#d3def4;border-color:#d3def4}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:6px}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#4575cf;background-color:#4575cf}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:6px;appearance:none}.custom-select:focus{border-color:#aac0e9;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#aac0e9;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:6px}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 6px 6px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#d3def4}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#d3def4}.custom-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#d3def4}.custom-range::-ms-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-top-left-radius:6px;border-top-right-radius:6px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:6px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#756f9a}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl,.navbar .container-xxl,.navbar .container-xxxl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:3px}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl,.navbar-expand-sm>.container-xxl,.navbar-expand-sm>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl,.navbar-expand-sm>.container-xxl,.navbar-expand-sm>.container-xxxl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl,.navbar-expand-md>.container-xxl,.navbar-expand-md>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl,.navbar-expand-md>.container-xxl,.navbar-expand-md>.container-xxxl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl,.navbar-expand-lg>.container-xxl,.navbar-expand-lg>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl,.navbar-expand-lg>.container-xxl,.navbar-expand-lg>.container-xxxl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl,.navbar-expand-xl>.container-xxl,.navbar-expand-xl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl,.navbar-expand-xl>.container-xxl,.navbar-expand-xl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media(max-width: 1599.98px){.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid,.navbar-expand-xxl>.container-sm,.navbar-expand-xxl>.container-md,.navbar-expand-xxl>.container-lg,.navbar-expand-xxl>.container-xl,.navbar-expand-xxl>.container-xxl,.navbar-expand-xxl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 1600px){.navbar-expand-xxl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid,.navbar-expand-xxl>.container-sm,.navbar-expand-xxl>.container-md,.navbar-expand-xxl>.container-lg,.navbar-expand-xxl>.container-xl,.navbar-expand-xxl>.container-xxl,.navbar-expand-xxl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}@media(max-width: 2599.98px){.navbar-expand-xxxl>.container,.navbar-expand-xxxl>.container-fluid,.navbar-expand-xxxl>.container-sm,.navbar-expand-xxxl>.container-md,.navbar-expand-xxxl>.container-lg,.navbar-expand-xxxl>.container-xl,.navbar-expand-xxxl>.container-xxl,.navbar-expand-xxxl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 2600px){.navbar-expand-xxxl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xxxl .navbar-nav{flex-direction:row}.navbar-expand-xxxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxxl>.container,.navbar-expand-xxxl>.container-fluid,.navbar-expand-xxxl>.container-sm,.navbar-expand-xxxl>.container-md,.navbar-expand-xxxl>.container-lg,.navbar-expand-xxxl>.container-xl,.navbar-expand-xxxl>.container-xxl,.navbar-expand-xxxl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xxxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxxl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl,.navbar-expand>.container-xxl,.navbar-expand>.container-xxxl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl,.navbar-expand>.container-xxl,.navbar-expand>.container-xxxl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:6px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:5px;border-top-right-radius:5px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:5px}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-right-radius:5px;border-bottom-left-radius:5px}.card-deck .card{margin-bottom:12px}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-12px;margin-left:-12px}.card-deck .card{flex:1 0 0%;margin-right:12px;margin-bottom:0;margin-left:12px}}.card-group>.card{margin-bottom:12px}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:6px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:6px}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#4575cf;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#29529f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px}.page-item:last-child .page-link{border-top-right-radius:6px;border-bottom-right-radius:6px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#4575cf;border-color:#4575cf}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#4575cf}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#2e5cb3}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1e7e34}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#117a8b}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#d39e00}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#bd2130}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:6px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#243d6c;background-color:#dae3f5;border-color:#cbd8f2}.alert-primary hr{border-top-color:#b7c9ed}.alert-primary .alert-link{color:#172746}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#e9ecef;border-radius:6px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#4575cf;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:6px}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#4575cf;border-color:#4575cf}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1600px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 2600px){.list-group-horizontal-xxxl{flex-direction:row}.list-group-horizontal-xxxl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xxxl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xxxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#243d6c;background-color:#cbd8f2}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#243d6c;background-color:#b7c9ed}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#243d6c;border-color:#243d6c}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:6px}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#4575cf !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#2e5cb3 !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#4575cf !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:.2rem !important}.rounded{border-radius:6px !important}.rounded-top{border-top-left-radius:6px !important;border-top-right-radius:6px !important}.rounded-right{border-top-right-radius:6px !important;border-bottom-right-radius:6px !important}.rounded-bottom{border-bottom-right-radius:6px !important;border-bottom-left-radius:6px !important}.rounded-left{border-top-left-radius:6px !important;border-bottom-left-radius:6px !important}.rounded-lg{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media(min-width: 1600px){.d-xxl-none{display:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}}@media(min-width: 2600px){.d-xxxl-none{display:none !important}.d-xxxl-inline{display:inline !important}.d-xxxl-inline-block{display:inline-block !important}.d-xxxl-block{display:block !important}.d-xxxl-table{display:table !important}.d-xxxl-table-row{display:table-row !important}.d-xxxl-table-cell{display:table-cell !important}.d-xxxl-flex{display:flex !important}.d-xxxl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}@media(min-width: 1600px){.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}}@media(min-width: 2600px){.flex-xxxl-row{flex-direction:row !important}.flex-xxxl-column{flex-direction:column !important}.flex-xxxl-row-reverse{flex-direction:row-reverse !important}.flex-xxxl-column-reverse{flex-direction:column-reverse !important}.flex-xxxl-wrap{flex-wrap:wrap !important}.flex-xxxl-nowrap{flex-wrap:nowrap !important}.flex-xxxl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xxxl-fill{flex:1 1 auto !important}.flex-xxxl-grow-0{flex-grow:0 !important}.flex-xxxl-grow-1{flex-grow:1 !important}.flex-xxxl-shrink-0{flex-shrink:0 !important}.flex-xxxl-shrink-1{flex-shrink:1 !important}.justify-content-xxxl-start{justify-content:flex-start !important}.justify-content-xxxl-end{justify-content:flex-end !important}.justify-content-xxxl-center{justify-content:center !important}.justify-content-xxxl-between{justify-content:space-between !important}.justify-content-xxxl-around{justify-content:space-around !important}.align-items-xxxl-start{align-items:flex-start !important}.align-items-xxxl-end{align-items:flex-end !important}.align-items-xxxl-center{align-items:center !important}.align-items-xxxl-baseline{align-items:baseline !important}.align-items-xxxl-stretch{align-items:stretch !important}.align-content-xxxl-start{align-content:flex-start !important}.align-content-xxxl-end{align-content:flex-end !important}.align-content-xxxl-center{align-content:center !important}.align-content-xxxl-between{align-content:space-between !important}.align-content-xxxl-around{align-content:space-around !important}.align-content-xxxl-stretch{align-content:stretch !important}.align-self-xxxl-auto{align-self:auto !important}.align-self-xxxl-start{align-self:flex-start !important}.align-self-xxxl-end{align-self:flex-end !important}.align-self-xxxl-center{align-self:center !important}.align-self-xxxl-baseline{align-self:baseline !important}.align-self-xxxl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}@media(min-width: 1600px){.float-xxl-left{float:left !important}.float-xxl-right{float:right !important}.float-xxl-none{float:none !important}}@media(min-width: 2600px){.float-xxxl-left{float:left !important}.float-xxxl-right{float:right !important}.float-xxxl-none{float:none !important}}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50,.ports-table-name{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.sockets-table-send_oct,.sockets-table-recv_oct,.ports-table-output,.px-4,.apps-table-version{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,tr>:first-child,.px-4,.apps-table-version{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}@media(min-width: 1600px){.m-xxl-0{margin:0 !important}.mt-xxl-0,.my-xxl-0{margin-top:0 !important}.mr-xxl-0,.mx-xxl-0{margin-right:0 !important}.mb-xxl-0,.my-xxl-0{margin-bottom:0 !important}.ml-xxl-0,.mx-xxl-0{margin-left:0 !important}.m-xxl-1{margin:.25rem !important}.mt-xxl-1,.my-xxl-1{margin-top:.25rem !important}.mr-xxl-1,.mx-xxl-1{margin-right:.25rem !important}.mb-xxl-1,.my-xxl-1{margin-bottom:.25rem !important}.ml-xxl-1,.mx-xxl-1{margin-left:.25rem !important}.m-xxl-2{margin:.5rem !important}.mt-xxl-2,.my-xxl-2{margin-top:.5rem !important}.mr-xxl-2,.mx-xxl-2{margin-right:.5rem !important}.mb-xxl-2,.my-xxl-2{margin-bottom:.5rem !important}.ml-xxl-2,.mx-xxl-2{margin-left:.5rem !important}.m-xxl-3{margin:1rem !important}.mt-xxl-3,.my-xxl-3{margin-top:1rem !important}.mr-xxl-3,.mx-xxl-3{margin-right:1rem !important}.mb-xxl-3,.my-xxl-3{margin-bottom:1rem !important}.ml-xxl-3,.mx-xxl-3{margin-left:1rem !important}.m-xxl-4{margin:1.5rem !important}.mt-xxl-4,.my-xxl-4{margin-top:1.5rem !important}.mr-xxl-4,.mx-xxl-4{margin-right:1.5rem !important}.mb-xxl-4,.my-xxl-4{margin-bottom:1.5rem !important}.ml-xxl-4,.mx-xxl-4{margin-left:1.5rem !important}.m-xxl-5{margin:3rem !important}.mt-xxl-5,.my-xxl-5{margin-top:3rem !important}.mr-xxl-5,.mx-xxl-5{margin-right:3rem !important}.mb-xxl-5,.my-xxl-5{margin-bottom:3rem !important}.ml-xxl-5,.mx-xxl-5{margin-left:3rem !important}.p-xxl-0{padding:0 !important}.pt-xxl-0,.py-xxl-0{padding-top:0 !important}.pr-xxl-0,.px-xxl-0{padding-right:0 !important}.pb-xxl-0,.py-xxl-0{padding-bottom:0 !important}.pl-xxl-0,.px-xxl-0{padding-left:0 !important}.p-xxl-1{padding:.25rem !important}.pt-xxl-1,.py-xxl-1{padding-top:.25rem !important}.pr-xxl-1,.px-xxl-1{padding-right:.25rem !important}.pb-xxl-1,.py-xxl-1{padding-bottom:.25rem !important}.pl-xxl-1,.px-xxl-1{padding-left:.25rem !important}.p-xxl-2{padding:.5rem !important}.pt-xxl-2,.py-xxl-2{padding-top:.5rem !important}.pr-xxl-2,.px-xxl-2{padding-right:.5rem !important}.pb-xxl-2,.py-xxl-2{padding-bottom:.5rem !important}.pl-xxl-2,.px-xxl-2{padding-left:.5rem !important}.p-xxl-3{padding:1rem !important}.pt-xxl-3,.py-xxl-3{padding-top:1rem !important}.pr-xxl-3,.px-xxl-3{padding-right:1rem !important}.pb-xxl-3,.py-xxl-3{padding-bottom:1rem !important}.pl-xxl-3,.px-xxl-3{padding-left:1rem !important}.p-xxl-4{padding:1.5rem !important}.pt-xxl-4,.py-xxl-4{padding-top:1.5rem !important}.pr-xxl-4,.px-xxl-4{padding-right:1.5rem !important}.pb-xxl-4,.py-xxl-4{padding-bottom:1.5rem !important}.pl-xxl-4,.px-xxl-4{padding-left:1.5rem !important}.p-xxl-5{padding:3rem !important}.pt-xxl-5,.py-xxl-5{padding-top:3rem !important}.pr-xxl-5,.px-xxl-5{padding-right:3rem !important}.pb-xxl-5,.py-xxl-5{padding-bottom:3rem !important}.pl-xxl-5,.px-xxl-5{padding-left:3rem !important}.m-xxl-n1{margin:-0.25rem !important}.mt-xxl-n1,.my-xxl-n1{margin-top:-0.25rem !important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-0.25rem !important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-0.25rem !important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-0.25rem !important}.m-xxl-n2{margin:-0.5rem !important}.mt-xxl-n2,.my-xxl-n2{margin-top:-0.5rem !important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-0.5rem !important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-0.5rem !important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-0.5rem !important}.m-xxl-n3{margin:-1rem !important}.mt-xxl-n3,.my-xxl-n3{margin-top:-1rem !important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-1rem !important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-1rem !important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.mt-xxl-n4,.my-xxl-n4{margin-top:-1.5rem !important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-1.5rem !important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-1.5rem !important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-1.5rem !important}.m-xxl-n5{margin:-3rem !important}.mt-xxl-n5,.my-xxl-n5{margin-top:-3rem !important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-3rem !important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-3rem !important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-3rem !important}.m-xxl-auto{margin:auto !important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto !important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto !important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto !important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto !important}}@media(min-width: 2600px){.m-xxxl-0{margin:0 !important}.mt-xxxl-0,.my-xxxl-0{margin-top:0 !important}.mr-xxxl-0,.mx-xxxl-0{margin-right:0 !important}.mb-xxxl-0,.my-xxxl-0{margin-bottom:0 !important}.ml-xxxl-0,.mx-xxxl-0{margin-left:0 !important}.m-xxxl-1{margin:.25rem !important}.mt-xxxl-1,.my-xxxl-1{margin-top:.25rem !important}.mr-xxxl-1,.mx-xxxl-1{margin-right:.25rem !important}.mb-xxxl-1,.my-xxxl-1{margin-bottom:.25rem !important}.ml-xxxl-1,.mx-xxxl-1{margin-left:.25rem !important}.m-xxxl-2{margin:.5rem !important}.mt-xxxl-2,.my-xxxl-2{margin-top:.5rem !important}.mr-xxxl-2,.mx-xxxl-2{margin-right:.5rem !important}.mb-xxxl-2,.my-xxxl-2{margin-bottom:.5rem !important}.ml-xxxl-2,.mx-xxxl-2{margin-left:.5rem !important}.m-xxxl-3{margin:1rem !important}.mt-xxxl-3,.my-xxxl-3{margin-top:1rem !important}.mr-xxxl-3,.mx-xxxl-3{margin-right:1rem !important}.mb-xxxl-3,.my-xxxl-3{margin-bottom:1rem !important}.ml-xxxl-3,.mx-xxxl-3{margin-left:1rem !important}.m-xxxl-4{margin:1.5rem !important}.mt-xxxl-4,.my-xxxl-4{margin-top:1.5rem !important}.mr-xxxl-4,.mx-xxxl-4{margin-right:1.5rem !important}.mb-xxxl-4,.my-xxxl-4{margin-bottom:1.5rem !important}.ml-xxxl-4,.mx-xxxl-4{margin-left:1.5rem !important}.m-xxxl-5{margin:3rem !important}.mt-xxxl-5,.my-xxxl-5{margin-top:3rem !important}.mr-xxxl-5,.mx-xxxl-5{margin-right:3rem !important}.mb-xxxl-5,.my-xxxl-5{margin-bottom:3rem !important}.ml-xxxl-5,.mx-xxxl-5{margin-left:3rem !important}.p-xxxl-0{padding:0 !important}.pt-xxxl-0,.py-xxxl-0{padding-top:0 !important}.pr-xxxl-0,.px-xxxl-0{padding-right:0 !important}.pb-xxxl-0,.py-xxxl-0{padding-bottom:0 !important}.pl-xxxl-0,.px-xxxl-0{padding-left:0 !important}.p-xxxl-1{padding:.25rem !important}.pt-xxxl-1,.py-xxxl-1{padding-top:.25rem !important}.pr-xxxl-1,.px-xxxl-1{padding-right:.25rem !important}.pb-xxxl-1,.py-xxxl-1{padding-bottom:.25rem !important}.pl-xxxl-1,.px-xxxl-1{padding-left:.25rem !important}.p-xxxl-2{padding:.5rem !important}.pt-xxxl-2,.py-xxxl-2{padding-top:.5rem !important}.pr-xxxl-2,.px-xxxl-2{padding-right:.5rem !important}.pb-xxxl-2,.py-xxxl-2{padding-bottom:.5rem !important}.pl-xxxl-2,.px-xxxl-2{padding-left:.5rem !important}.p-xxxl-3{padding:1rem !important}.pt-xxxl-3,.py-xxxl-3{padding-top:1rem !important}.pr-xxxl-3,.px-xxxl-3{padding-right:1rem !important}.pb-xxxl-3,.py-xxxl-3{padding-bottom:1rem !important}.pl-xxxl-3,.px-xxxl-3{padding-left:1rem !important}.p-xxxl-4{padding:1.5rem !important}.pt-xxxl-4,.py-xxxl-4{padding-top:1.5rem !important}.pr-xxxl-4,.px-xxxl-4{padding-right:1.5rem !important}.pb-xxxl-4,.py-xxxl-4{padding-bottom:1.5rem !important}.pl-xxxl-4,.px-xxxl-4{padding-left:1.5rem !important}.p-xxxl-5{padding:3rem !important}.pt-xxxl-5,.py-xxxl-5{padding-top:3rem !important}.pr-xxxl-5,.px-xxxl-5{padding-right:3rem !important}.pb-xxxl-5,.py-xxxl-5{padding-bottom:3rem !important}.pl-xxxl-5,.px-xxxl-5{padding-left:3rem !important}.m-xxxl-n1{margin:-0.25rem !important}.mt-xxxl-n1,.my-xxxl-n1{margin-top:-0.25rem !important}.mr-xxxl-n1,.mx-xxxl-n1{margin-right:-0.25rem !important}.mb-xxxl-n1,.my-xxxl-n1{margin-bottom:-0.25rem !important}.ml-xxxl-n1,.mx-xxxl-n1{margin-left:-0.25rem !important}.m-xxxl-n2{margin:-0.5rem !important}.mt-xxxl-n2,.my-xxxl-n2{margin-top:-0.5rem !important}.mr-xxxl-n2,.mx-xxxl-n2{margin-right:-0.5rem !important}.mb-xxxl-n2,.my-xxxl-n2{margin-bottom:-0.5rem !important}.ml-xxxl-n2,.mx-xxxl-n2{margin-left:-0.5rem !important}.m-xxxl-n3{margin:-1rem !important}.mt-xxxl-n3,.my-xxxl-n3{margin-top:-1rem !important}.mr-xxxl-n3,.mx-xxxl-n3{margin-right:-1rem !important}.mb-xxxl-n3,.my-xxxl-n3{margin-bottom:-1rem !important}.ml-xxxl-n3,.mx-xxxl-n3{margin-left:-1rem !important}.m-xxxl-n4{margin:-1.5rem !important}.mt-xxxl-n4,.my-xxxl-n4{margin-top:-1.5rem !important}.mr-xxxl-n4,.mx-xxxl-n4{margin-right:-1.5rem !important}.mb-xxxl-n4,.my-xxxl-n4{margin-bottom:-1.5rem !important}.ml-xxxl-n4,.mx-xxxl-n4{margin-left:-1.5rem !important}.m-xxxl-n5{margin:-3rem !important}.mt-xxxl-n5,.my-xxxl-n5{margin-top:-3rem !important}.mr-xxxl-n5,.mx-xxxl-n5{margin-right:-3rem !important}.mb-xxxl-n5,.my-xxxl-n5{margin-bottom:-3rem !important}.ml-xxxl-n5,.mx-xxxl-n5{margin-left:-3rem !important}.m-xxxl-auto{margin:auto !important}.mt-xxxl-auto,.my-xxxl-auto{margin-top:auto !important}.mr-xxxl-auto,.mx-xxxl-auto{margin-right:auto !important}.mb-xxxl-auto,.my-xxxl-auto{margin-bottom:auto !important}.ml-xxxl-auto,.mx-xxxl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1600px){.text-xxl-left{text-align:left !important}.text-xxl-right{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 2600px){.text-xxxl-left{text-align:left !important}.text-xxxl-right{text-align:right !important}.text-xxxl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#4575cf !important}a.text-primary:hover,a.text-primary:focus{color:#29529f !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#19692c !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#0f6674 !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#ba8b00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#a71d2a !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-body{color:#212529 !important}.text-muted{color:rgba(85,91,104,.5) !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:rgba(0,0,0,0);text-shadow:none;background-color:rgba(0,0,0,0);border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{height:100%;background-color:#dae0ee}body{background-color:#dae0ee;background:linear-gradient(-15deg, #dae0ee, #ebeff6);background-size:cover;background-repeat:repeat-x;color:#555b68;font-size:16px;line-height:1.5;height:100%}#main{padding-top:3.5rem;position:relative}.layout-wrapper{min-height:100%}.progress{border-radius:.5rem}tr[phx-click]{cursor:pointer}table.table-hover tbody tr:hover{background-color:#f2f4f9}.dash-table{color:#4e5156;margin-bottom:0}.dash-table th{background-color:#f2f4f9;white-space:nowrap}.dash-table .dash-table-icon{padding-left:.25rem;display:inline-block}.dash-table .icon-sort{display:inline-block;width:0;height:0;line-height:6px;position:relative;top:-1px;vertical-align:middle}.dash-table .icon-asc{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #71747c}.dash-table .icon-desc{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid #71747c}.dash-table-wrapper{border-radius:6px 6px 0 0;overflow-x:auto}.app-info{overflow:auto}.app-info .node{fill:#f2f4f9;stroke:#e6eaf3;stroke-width:1}.app-info .node:hover{cursor:pointer;fill:#e6eaf3}.app-info .node:hover+.tree-node-text{fill:#3d3f43}.app-info .line{stroke:#e6eaf3;stroke-width:2}.app-info .tree{position:relative;margin:20px 0}.app-info .tree-node-text{fill:#555b68;font-size:14px;font-family:"LiveDashboardFont";pointer-events:none}#elixir-card{background:linear-gradient(40deg, #754fa2, #6979db);color:#fff}#phoenix-card{background:linear-gradient(40deg, #f26d40, #dfa843);color:#fff}#app-card{background:linear-gradient(40deg, #4575cf, #36a4ee);color:#fff}.bg-green{background-color:#4db167}.bg-blue{background-color:#5d89c7}.bg-purple{background-color:#754fa2}.bg-yellow{background-color:#f9bc14}.bg-orange{background-color:#f26d40}.bg-dark-gray{background-color:#9498a2}.bg-light-gray{background-color:#eceff6}.bg-card-default{background-color:#fff}.bg-gradient-green{background:linear-gradient(40deg, #4db167, #70c185)}.bg-gradient-blue{background:linear-gradient(40deg, #5d89c7, #83a5d4)}.bg-gradient-purple{background:linear-gradient(40deg, #754fa2, #8f6cb8)}.bg-gradient-yellow{background:linear-gradient(40deg, #f9bc14, #faca46)}.bg-gradient-orange{background:linear-gradient(40deg, #f26d40, #f58a66)}.bg-gradient-dark-gray{background:linear-gradient(40deg, #9498a2, #afb2ba)}.bg-gradient-light-gray{background:linear-gradient(40deg, #eceff6, #f3f5f9)}.banner-card{border-radius:6px;box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75);background-color:#fff;padding:1rem}.banner-card-title{margin-bottom:.2rem}.banner-card-value{font-size:1.5rem;font-weight:bold;margin-bottom:-0.15rem}#system-info-card .banner-card-value{font-size:16px;font-weight:400;padding:.3rem}.btn.btn-primary{background-color:#756f9a;border-width:0}.btn.btn-primary:not(:disabled):not(.disabled):active{background-color:#474360}.btn.btn-secondary{background-color:#8b8b8b;border-width:0}.card{border-radius:6px;box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75);border:none}.card-title{margin-bottom:.75rem}.card-title .badge{font-weight:inherit}.card-usage{padding-top:12px;padding-bottom:12px}.charts-col{margin-bottom:2rem}.charts-col .card{padding:.5rem}.charts-col .card .hint{position:absolute;right:14px}.charts-col .card .uplot{font-family:"LiveDashboardFont";max-width:100%}.charts-col .card .uplot.summary .legend tr:nth-child(n+3){display:table-row}.charts-col .card .uplot .title{font-weight:900;margin-bottom:.75rem}.charts-col .card .uplot .legend{margin-top:1.75rem;font-size:.75rem;width:100%;table-layout:fixed}.charts-col .card .uplot .legend .labels{background-color:#f2f4f9;color:#71747c}.charts-col .card .uplot .legend .labels th{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-width:0;text-align:center;padding:4px}.charts-col .card .uplot .legend .series th{text-align:left}.charts-col .card .uplot .legend .series td{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-width:0}.charts-col .card .uplot .legend.inline{display:flex;flex-wrap:wrap;text-align:left;margin-top:0}.charts-col .card .uplot .legend.inline .series{display:flex;flex-basis:45%;order:10}.charts-col .card .uplot .legend.inline .series th{align-items:center;display:flex;flex-basis:55px}.charts-col .card .uplot .legend.inline .series:first-child{background-color:#f2f4f9;color:#71747c;flex-basis:100%;margin:1.75rem 0 .5rem 0;order:1;text-align:center;display:inline-block}.charts-col .card .uplot .legend.inline .series:first-child th{display:inline-block}.charts-col .card .uplot .legend.inline .series:first-child .ident{display:none}.charts-col .card .uplot .legend.inline .series:nth-child(2){order:2}.charts-col .card .uplot .legend.inline .series:nth-child(5){order:4}.charts-col .card .uplot .legend.inline .series:nth-child(3){order:3}@media(min-width: 1600px){[data-phx-view="LiveDashboard.MetricsLive"] #main.container{max-width:95%}[data-phx-view="LiveDashboard.MetricsLive"] #main.container .charts-nav{max-width:1140px}}.code-field{background-color:#f2f4f9;color:#9498a2;border-radius:6px;border-width:0;font-weight:100;padding:.5rem .75rem;white-space:nowrap;width:100%;resize:none;overflow:auto;margin-bottom:.75rem;scrollbar-width:none}.code-field:focus{outline:none}.code-field::-webkit-scrollbar{display:none}.cookie-status{display:inline-block;padding:.35rem 0 .25rem 0;transition:all .3s ease-out;padding-left:18px;position:relative;opacity:0}.cookie-status[data-enabled]{opacity:.75}.cookie-status::before{background-color:#df0606;content:"";display:block;height:10px;width:10px;border-radius:50px;top:.82rem;left:0;position:absolute;animation-name:pulse;animation-iteration-count:infinite;animation-duration:1.2s;animation-timing-function:ease-in-out}@keyframes pulse{0%{opacity:1}45%{opacity:1}50%{opacity:0}95%{opacity:0}}.copy-indicator{opacity:0;padding:.375rem .75rem;display:inline-block}.copy-indicator[data-enabled]{animation-name:blink;animation-duration:1.5s;animation-timing-function:ease-out}@keyframes blink{0%{opacity:0}20%{opacity:1}60%{opacity:1}100%{opacity:0}}.fields-card dl{margin-bottom:0}.fields-card dl .code-field{margin-bottom:.25rem}.fields-card dl dd:last-child{margin-bottom:0}.fields-card dl dd:last-child .code-field{margin-bottom:0}header{background:#4a4473;position:relative}header h1{text-shadow:2px 2px 0 rgba(23,31,50,.5);color:#eceff6;font-size:1.75rem;margin-top:2.75rem;margin-bottom:0}header .container{position:relative;z-index:3}#menu-bar{margin-top:auto;box-shadow:0 2px 5px rgba(201,209,230,.15),0 7px 20px rgba(201,209,230,.3);border-radius:6px;background-color:#fff;display:inline-block;padding:0 .75rem;margin-top:1rem;margin-bottom:-1.5rem;position:relative;width:100%}#menu-bar .menu-item{display:inline-block;padding:.75rem;position:relative;text-decoration:none;color:rgba(69,117,207,.75)}#menu-bar .menu-item:hover{color:#3d2954}#menu-bar .menu-item.active{color:#3d2954;text-shadow:1px 1px rgba(69,117,207,.1)}#menu-bar .menu-item-disabled{color:rgba(85,91,104,.5)}#menu-bar .menu-item-disabled:hover{color:rgba(85,91,104,.5)}#menu-bar .menu-item-enable-button{background-color:#756f9a;border-radius:3px;color:#ededed;position:absolute;font-size:.75rem;right:50%;bottom:-15px;padding:.15rem .5rem;transform:translateX(50%)}#menu-bar .menu-item-enable-button:hover{background-color:#837ea5;text-decoration:none}#nav-dropdowns{position:absolute;top:0rem;right:0rem;padding-top:.25rem;padding-right:.75rem;font-size:.9rem}#nav-dropdowns form{margin:.5em 0;justify-content:flex-end;display:flex;flex-flow:row wrap}#nav-dropdowns label{color:#dae0ee;margin:0 .5rem 0 0;line-height:1.9rem;display:flex}#nav-dropdowns label.no-select{margin:0}#nav-dropdowns .custom-select{background-color:rgba(218,224,238,.75);border-radius:6px;border-width:0;color:#000;width:auto}@media(max-width: 768px){header h1{font-size:1.25rem;margin-top:1.25rem}#menu-bar{padding:0 .5rem;margin-top:0}#menu-bar .menu-item{padding:.75rem .5rem}#nav-dropdowns{position:relative;text-align:center;width:100%;padding:0;margin-bottom:.4rem}#nav-dropdowns form{justify-content:flex-start}#nav-dropdowns label{line-height:1rem;margin-bottom:.25rem}#nav-dropdowns .custom-select{width:100%}}footer{text-align:center;padding:1.5rem 0}footer img{width:16px;margin:0 3px 3px 0}footer .footer-dashbit{padding-left:.125rem}.hint{display:inline-block;position:relative}.hint .hint-text{box-shadow:0 2px 5px rgba(23,31,50,.15),0 7px 20px rgba(201,209,230,.3);display:none}.hint .hint-icon{cursor:help;height:15px;width:15px;position:relative;top:-1px}.hint:hover .hint-text{border:1px solid #b7bcc8;border-radius:6px;background-color:#f2f4f9;color:#71747c;display:block;position:absolute;transform:translateX(-50%);font-size:1rem;bottom:30px;left:18px;width:300px;padding:1rem 1.5rem;z-index:10}.hint .hint-icon-fill{fill:#b7bcc8}.hint .hint-icon-stroke{stroke:#b7bcc8}.card-title .hint .hint-icon-fill{fill:#9498a2}.card-title .hint .hint-icon-stroke{stroke:#9498a2}@media(max-width: 576px){.hint:hover .hint-text{transform:none;left:0}}.logs-card{display:none}.logs-card[data-messages-present=true]{display:block}.logs-card #logger-messages{overflow-y:scroll;height:350px}.logs-card #logger-messages pre{color:#555b68;margin-bottom:0;padding:.25rem;font-size:.75rem}.logs-card #logger-messages pre:hover{background-color:rgba(237,237,237,.5)}.logs-card #logger-messages pre.log-level-debug{color:rgba(85,91,104,.75)}.tabular-column-name,td.sockets-table-port,.processes-table-current_function,.processes-table-name_or_initial_call{padding-right:0;max-width:350px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabular-column-id,td.sockets-table-port,.ports-table-port{color:#71747c}.tabular-column-bytes,td.sockets-table-send_oct,td.sockets-table-recv_oct,.ports-table-output,td.ports-table-input,.ets-table-memory{text-align:right;white-space:nowrap}.tabular-search{float:right}.tabular-search ::placeholder{color:#b7bcc8}.custom-select{background-color:#dae0ee;border-radius:6px;border-width:0}@media(max-width: 992px){.tabular{font-size:.85rem}.tabular-card{border-radius:0;margin-left:-2rem;margin-right:-2rem}.tabular-column-name,td.sockets-table-port,.processes-table-current_function,.processes-table-name_or_initial_call{max-width:150px}}.table-hover .active{color:#212529;background-color:rgba(0,0,0,.075)}.dash-modal{display:block;overflow-y:auto;background-color:rgba(49,50,53,.5)}.dash-modal pre{margin-bottom:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.dash-modal .modal-dialog{max-width:900px}.dash-modal .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.dash-modal .modal-fullscreen .modal-content{height:100%;border:0;border-radius:none}.dash-modal .modal-fullscreen .modal-header{border-radius:none}.dash-modal .modal-fullscreen .modal-body{overflow-y:auto}.dash-modal .modal-header{background-color:#f2f4f9;border-bottom:2px solid #dae0ee;padding:1rem 1.5rem}.dash-modal .modal-header h6{font-weight:700}.dash-modal .modal-content .modal-action{padding:1rem;margin:-1rem -1rem -1rem auto;line-height:1}.dash-modal .modal-content .modal-action-item{display:inline-block;color:#aaa;font-size:1.5rem;vertical-align:middle;font-weight:bold;text-align:right}.dash-modal .modal-content .modal-action-item:hover,.dash-modal .modal-content .modal-action-item:focus{color:#000;text-decoration:none;cursor:pointer}.dash-modal .modal-content .modal-action-hidden{display:none}@media(max-width: 992px){.dash-modal .modal-dialog{max-width:700px}}.nav-bar{background-color:#dae0ee;border-radius:6px;line-height:1.6}.nav-bar .nav-link{color:#4e5156}.nav-bar .nav-link:hover{color:#3d2954}.nav-bar .nav-link.active{color:#3d2954;border-bottom:3px solid #756f9a}.color-bar-progress{border-radius:2px;height:1.5rem;background-color:rgba(0,0,0,0);position:relative}.color-bar-progress-title{color:#9498a2;position:absolute;right:6px;top:2px;font-weight:bold}.color-bar-progress-bar{border-color:#fff;border-style:solid;border-width:0 1px;min-width:4px;flex-grow:0;user-select:none;cursor:pointer}.color-bar-progress-bar[data-empty=true]{display:none}.color-bar-progress-bar[data-muted=true]{opacity:.15}.color-bar-progress-bar.bg-gradient-light-gray[data-muted=false]{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);background:linear-gradient(90deg, #e2e6f1, #e9ecf4)}.color-bar-progress-bar.bg-gradient-light-gray[data-muted=true]{opacity:1;background:linear-gradient(90deg, #f6f8fb, #f3f5f9)}.color-bar-progress-bar:last-of-type{border-right-width:0}.color-bar-progress-bar:first-of-type{border-left-width:0;min-width:3px}.color-bar-progress-bar:hover{box-shadow:inset 0 0 0 1px rgba(78,81,86,.25),inset 0 0 0 3px rgba(242,244,249,.15);filter:contrast(120%) brightness(90%)}.color-bar-progress-bar:hover[data-muted=true]{opacity:.6}.color-bar-progress-bar.bg-gradient-light-gray:hover,.color-bar-progress-bar:hover .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);filter:none}.color-bar-legend-color{border-radius:3px;display:inline-block;height:16px;width:16px}.color-bar-legend-entry{user-select:none;cursor:pointer}.color-bar-legend-entry[data-muted=true]{opacity:.15}.color-bar-legend-entry[data-muted=false] .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15)}.color-bar-legend-entry:hover{box-shadow:none;filter:contrast(120%) brightness(90%)}.color-bar-legend-entry:hover[data-muted=true]{opacity:.6}.color-bar-legend-entry.bg-gradient-light-gray:hover,.color-bar-legend-entry:hover .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);filter:none}.layered-graph .connection-line{stroke:#dae0ee;fill:#dae0ee;stroke-width:1}.layered-graph .node-label,.layered-graph .node-detail{fill:#fff;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";text-anchor:middle}.layered-graph .card-body{overflow-x:auto}.resource-usage-total{background-color:#f2f4f9;color:#71747c}.resource-usage-total-value{color:#555b68}.tabular-info .tabular-info-not-exists{border-radius:6px;color:#fff;background-color:#9498a2;padding:1rem 1.5rem}.tabular-info .tabular-info-table td:empty::after,.tabular-info .tabular-info-table pre:empty::after{font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";content:"---";opacity:.5;font-size:1rem}.tabular-info .tabular-info-table td:first-child{font-weight:700}.tabular-info .tabular-info-table td:last-child{width:70%}.phx-click-loading{opacity:.5;transition:opacity 1s ease-out}.phx-disconnected{cursor:wait}.phx-disconnected *{pointer-events:none} diff --git a/dist/js/app.js b/dist/js/app.js index ed165834..fa48cdd4 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -1,6 +1,6 @@ -(()=>{var Zr=Object.create;var Rs=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var Xr=Object.getOwnPropertyNames;var eo=Object.getPrototypeOf,to=Object.prototype.hasOwnProperty;var lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var no=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Xr(t))!to.call(e,r)&&r!==n&&Rs(e,r,{get:()=>t[r],enumerable:!(s=Qr(t,r))||s.enumerable});return e};var so=(e,t,n)=>(n=e!=null?Zr(eo(e)):{},no(t||!e||!e.__esModule?Rs(n,"default",{value:e,enumerable:!0}):n,e));var Vs=lo((En,zs)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof En=="object"?zs.exports=t():e.NProgress=t()})(En,function(){var e={};e.version="0.2.0";var t=e.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};e.configure=function(u){var w,x;for(w in u)x=u[w],x!==void 0&&u.hasOwnProperty(w)&&(t[w]=x);return this},e.status=null,e.set=function(u){var w=e.isStarted();u=n(u,t.minimum,1),e.status=u===1?null:u;var x=e.render(!w),M=x.querySelector(t.barSelector),L=t.speed,N=t.easing;return x.offsetWidth,f(function(E){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),c(M,r(u,L,N)),u===1?(c(x,{transition:"none",opacity:1}),x.offsetWidth,setTimeout(function(){c(x,{transition:"all "+L+"ms linear",opacity:0}),setTimeout(function(){e.remove(),E()},L)},L)):setTimeout(E,L)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var u=function(){setTimeout(function(){!e.status||(e.trickle(),u())},t.trickleSpeed)};return t.trickle&&u(),this},e.done=function(u){return!u&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(u){var w=e.status;return w?(typeof u!="number"&&(u=(1-w)*n(Math.random()*w,.1,.95)),w=n(w+u,0,.994),e.set(w)):e.start()},e.trickle=function(){return e.inc(Math.random()*t.trickleRate)},function(){var u=0,w=0;e.promise=function(x){return!x||x.state()==="resolved"?this:(w===0&&e.start(),u++,w++,x.always(function(){w--,w===0?(u=0,e.done()):e.set((u-w)/u)}),this)}}(),e.render=function(u){if(e.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");var w=document.createElement("div");w.id="nprogress",w.innerHTML=t.template;var x=w.querySelector(t.barSelector),M=u?"-100":s(e.status||0),L=document.querySelector(t.parent),N;return c(x,{transition:"all 0 linear",transform:"translate3d("+M+"%,0,0)"}),t.showSpinner||(N=w.querySelector(t.spinnerSelector),N&&y(N)),L!=document.body&&d(L,"nprogress-custom-parent"),L.appendChild(w),w},e.remove=function(){g(document.documentElement,"nprogress-busy"),g(document.querySelector(t.parent),"nprogress-custom-parent");var u=document.getElementById("nprogress");u&&y(u)},e.isRendered=function(){return!!document.getElementById("nprogress")},e.getPositioningCSS=function(){var u=document.body.style,w="WebkitTransform"in u?"Webkit":"MozTransform"in u?"Moz":"msTransform"in u?"ms":"OTransform"in u?"O":"";return w+"Perspective"in u?"translate3d":w+"Transform"in u?"translate":"margin"};function n(u,w,x){return ux?x:u}function s(u){return(-1+u)*100}function r(u,w,x){var M;return t.positionUsing==="translate3d"?M={transform:"translate3d("+s(u)+"%,0,0)"}:t.positionUsing==="translate"?M={transform:"translate("+s(u)+"%,0)"}:M={"margin-left":s(u)+"%"},M.transition="all "+w+"ms "+x,M}var f=function(){var u=[];function w(){var x=u.shift();x&&x(w)}return function(x){u.push(x),u.length==1&&w()}}(),c=function(){var u=["Webkit","O","Moz","ms"],w={};function x(E){return E.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(v,C){return C.toUpperCase()})}function M(E){var v=document.body.style;if(E in v)return E;for(var C=u.length,D=E.charAt(0).toUpperCase()+E.slice(1),R;C--;)if(R=u[C]+D,R in v)return R;return E}function L(E){return E=x(E),w[E]||(w[E]=M(E))}function N(E,v,C){v=L(v),E.style[v]=C}return function(E,v){var C=arguments,D,R;if(C.length==2)for(D in v)R=v[D],R!==void 0&&v.hasOwnProperty(D)&&N(E,D,R);else N(E,C[1],C[2])}}();function m(u,w){var x=typeof u=="string"?u:_(u);return x.indexOf(" "+w+" ")>=0}function d(u,w){var x=_(u),M=x+w;m(x,w)||(u.className=M.substring(1))}function g(u,w){var x=_(u),M;!m(u,w)||(M=x.replace(" "+w+" "," "),u.className=M.substring(1,M.length-1))}function _(u){return(" "+(u.className||"")+" ").replace(/\s+/gi," ")}function y(u){u&&u.parentNode&&u.parentNode.removeChild(u)}return e})});var ss=so(Vs());var Ns={phoenix:[242,110,64],elixir:[75,68,115],red:[255,99,132],orange:[255,159,64],yellow:[255,205,86],green:[75,192,192],blue:[54,162,253],purple:[153,102,255],grey:[201,203,207]},Fs=Object.keys(Ns),Os={at:e=>{let[t,n,s]=Os.rgb(e);return`rgb(${t}, ${n}, ${s})`},rgb:e=>Ns[Fs[e%Fs.length]]},Ol={at:e=>{let[t,n,s]=Os.rgb(e);return{stroke:`rgb(${t}, ${n}, ${s})`,fill:`rgb(${t}, ${n}, ${s}, 0.1)`}}};var ve="u-",io="uplot",ro=ve+"hz",oo=ve+"vt",ao=ve+"title",uo=ve+"wrap",co=ve+"under",fo=ve+"over",ho=ve+"axis",Tt=ve+"off",po=ve+"select",mo=ve+"cursor-x",go=ve+"cursor-y",wo=ve+"cursor-pt",So=ve+"legend",vo=ve+"live",_o=ve+"inline",yo=ve+"thead",bo=ve+"series",xo=ve+"marker",Hs=ve+"label",ko=ve+"value",pl="width",ml="height",hl="top",Is="bottom",Yt="left",Pn="right",Yn="#000",Ws=Yn+"0",Bs="mousemove",Ys="mousedown",An="mouseup",Gs="mouseenter",qs="mouseleave",Us="dblclick",Mo="resize",To="scroll",$s="change",Yl="dppxchange",jt=typeof window<"u",Nn=jt?document:null,Ut=jt?window:null,Do=jt?navigator:null,te,Hl;function On(){let e=devicePixelRatio;te!=e&&(te=e,Hl&&In($s,Hl,On),Hl=matchMedia(`(min-resolution: ${te-.001}dppx) and (max-resolution: ${te+.001}dppx)`),Ct($s,Hl,On),Ut.dispatchEvent(new CustomEvent(Yl)))}function $e(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Hn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function ce(e,t,n){e.style[t]=n+"px"}function ct(e,t,n,s){let r=Nn.createElement(e);return t!=null&&$e(r,t),n?.insertBefore(r,s),r}function et(e,t){return ct("div",e,t)}var Ks=new WeakMap;function Gt(e,t,n,s,r){let f="translate("+t+"px,"+n+"px)",c=Ks.get(e);f!=c&&(e.style.transform=f,Ks.set(e,f),t<0||n<0||t>s||n>r?$e(e,Tt):Hn(e,Tt))}var js=new WeakMap;function Co(e,t,n){let s=t+n,r=js.get(e);s!=r&&(js.set(e,s),e.style.background=t,e.style.borderColor=n)}var Js=new WeakMap;function Eo(e,t,n,s){let r=t+""+n,f=Js.get(e);r!=f&&(Js.set(e,r),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=s?-t/2+"px":0,e.style.marginTop=s?-n/2+"px":0)}var Gn={passive:!0},xi={...Gn,capture:!0};function Ct(e,t,n,s){t.addEventListener(e,n,s?xi:Gn)}function In(e,t,n,s){t.removeEventListener(e,n,s?xi:Gn)}jt&&On();function vt(e,t,n,s){let r;n=n||0,s=s||t.length-1;let f=s<=2147483647;for(;s-n>1;)r=f?n+s>>1:Ke((n+s)/2),t[r]=t&&r<=n;r+=s)if(e[r]!=null)return r;return-1}function Po(e,t,n,s){let r=Q,f=-Q;if(s==1)r=e[t],f=e[n];else if(s==-1)r=e[n],f=e[t];else for(let c=t;c<=n;c++)e[c]!=null&&(r=Ge(r,e[c]),f=Le(f,e[c]));return[r,f]}function Ao(e,t,n){let s=Q,r=-Q;for(let f=t;f<=n;f++)e[f]>0&&(s=Ge(s,e[f]),r=Le(r,e[f]));return[s==Q?1:s,r==-Q?10:r]}var Ln=[0,0];function Zs(e,t,n,s){return Ln[0]=n<0?oe(e,-n):e,Ln[1]=s<0?oe(t,-s):t,Ln}function $l(e,t,n,s){let r=Vo(e),f=n==10?Et:ki;e==t&&(r==-1?(e*=n,t/=n):(e/=n,t*=n));let c,m,d;return s?(c=Ke(f(e)),m=Kn(f(t)),d=Zs(_t(n,c),_t(n,m),c,m),e=d[0],t=d[1]):(c=Ke(f(Ye(e))),m=Ke(f(Ye(t))),d=Zs(_t(n,c),_t(n,m),c,m),e=Ti(e,d[0]),t=Pt(t,d[1])),[e,t]}function qn(e,t,n,s){let r=$l(e,t,n,s);return e==0&&(r[0]=0),t==0&&(r[1]=0),r}var Un=.1,Qs={mode:3,pad:Un},wl={pad:0,soft:null,mode:0},Lo={min:wl,max:wl};function Gl(e,t,n,s){return jl(n)?Xs(e,t,n):(wl.pad=n,wl.soft=s?0:null,wl.mode=s?3:0,Xs(e,t,Lo))}function le(e,t){return e??t}function Ro(e,t,n){for(t=le(t,0),n=le(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function Xs(e,t,n){let s=n.min,r=n.max,f=le(s.pad,0),c=le(r.pad,0),m=le(s.hard,-Q),d=le(r.hard,Q),g=le(s.soft,Q),_=le(r.soft,-Q),y=le(s.mode,0),u=le(r.mode,0),w=t-e;w<1e-9&&(w=0,(e==0||t==0)&&(w=1e-9,y==2&&g!=Q&&(f=0),u==2&&_!=-Q&&(c=0)));let x=w||Ye(t)||1e3,M=Et(x),L=_t(10,Ke(M)),N=x*(w==0?e==0?.1:1:f),E=oe(Ti(e-N,L/10),9),v=e>=g&&(y==1||y==3&&E<=g||y==2&&E>=g)?g:Q,C=Le(m,E=v?v:Ge(v,E)),D=x*(w==0?t==0?.1:1:c),R=oe(Pt(t+D,L/10),9),A=t<=_&&(u==1||u==3&&R>=_||u==2&&R<=_)?_:-Q,W=Ge(d,R>A&&t<=A?A:Le(A,R));return C==W&&C==0&&(W=100),[C,W]}var zo=new Intl.NumberFormat(jt?Do.language:"en-US"),$n=e=>zo.format(e),je=Math,Bl=je.PI,Ye=je.abs,Ke=je.floor,Me=je.round,Kn=je.ceil,Ge=je.min,Le=je.max,_t=je.pow,Vo=je.sign,Et=je.log10,ki=je.log2,Fo=(e,t=1)=>je.sinh(e)*t,Rn=(e,t=1)=>je.asinh(e/t),Q=1/0;function ei(e){return(Et((e^e>>31)-(e>>31))|0)+1}function Mt(e,t){return Me(e/t)*t}function ti(e,t,n){return Ge(Le(e,t),n)}function ee(e){return typeof e=="function"?e:()=>e}var No=e=>e,Mi=(e,t)=>t,Oo=e=>null,li=e=>!0,ni=(e,t)=>e==t;function Pt(e,t){return Kn(e/t)*t}function Ti(e,t){return Ke(e/t)*t}function oe(e,t){return Me(e*(t=10**t))/t}var Kl=new Map;function Ho(e){return((""+e).split(".")[1]||"").length}function vl(e,t,n,s){let r=[],f=s.map(Ho);for(let c=t;c=0&&c>=0?0:m)+(c>=f[g]?0:f[g]),u=oe(_,y);r.push(u),Kl.set(u,y)}}return r}var Sl={},Di=[],Kt=[null,null],Dt=Array.isArray;function si(e){return typeof e=="string"}function jl(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function ii(e){return e!=null&&typeof e=="object"}var Io=Object.getPrototypeOf(Uint8Array);function At(e,t=jl){let n;if(Dt(e)){let s=e.find(r=>r!=null);if(Dt(s)||t(s)){n=Array(e.length);for(let r=0;rf){for(r=c-1;r>=0&&e[r]==null;)e[r--]=null;for(r=c+1;rc-m)],r=s[0].length,f=new Map;for(let c=0;c"u"?e=>Promise.resolve().then(e):queueMicrotask,Ci=["January","February","March","April","May","June","July","August","September","October","November","December"],Ei=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function Pi(e){return e.slice(0,3)}var $o=Ei.map(Pi),Ko=Ci.map(Pi),jo={MMMM:Ci,MMM:Ko,WWWW:Ei,WWW:$o};function dl(e){return(e<10?"0":"")+e}function Jo(e){return(e<10?"00":e<100?"0":"")+e}var Zo={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>dl(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>dl(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>dl(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?"PM":"AM",aa:e=>e.getHours()>=12?"pm":"am",a:e=>e.getHours()>=12?"p":"a",mm:e=>dl(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>dl(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>Jo(e.getMilliseconds())};function jn(e,t){t=t||jo;let n=[],s=/\{([a-z]+)\}|[^{]+/gi,r;for(;r=s.exec(e);)n.push(r[0][0]=="{"?Zo[r[1]]:r[0]);return f=>{let c="";for(let m=0;me%1==0,ql=[1,2,2.5,5],ea=vl(10,-16,0,ql),Li=vl(10,0,16,ql),ta=Li.filter(Ai),la=ea.concat(Li),Jn=` -`,Ri="{YYYY}",ri=Jn+Ri,zi="{M}/{D}",gl=Jn+zi,Il=gl+"/{YY}",Vi="{aa}",na="{h}:{mm}",qt=na+Vi,oi=Jn+qt,ai=":{ss}",ie=null;function Fi(e){let t=e*1e3,n=t*60,s=n*60,r=s*24,f=r*30,c=r*365,d=(e==1?vl(10,0,3,ql).filter(Ai):vl(10,-3,0,ql)).concat([t,t*5,t*10,t*15,t*30,n,n*5,n*10,n*15,n*30,s,s*2,s*3,s*4,s*6,s*8,s*12,r,r*2,r*3,r*4,r*5,r*6,r*7,r*8,r*9,r*10,r*15,f,f*2,f*3,f*4,f*6,c,c*2,c*5,c*10,c*25,c*50,c*100]),g=[[c,Ri,ie,ie,ie,ie,ie,ie,1],[r*28,"{MMM}",ri,ie,ie,ie,ie,ie,1],[r,zi,ri,ie,ie,ie,ie,ie,1],[s,"{h}"+Vi,Il,ie,gl,ie,ie,ie,1],[n,qt,Il,ie,gl,ie,ie,ie,1],[t,ai,Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1],[e,ai+".{fff}",Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1]];function _(y){return(u,w,x,M,L,N)=>{let E=[],v=L>=c,C=L>=f&&L=r?r:L,$=Ke(x)-Ke(R),P=W+$+Pt(R-W,Y);E.push(P);let U=y(P),re=U.getHours()+U.getMinutes()/n+U.getSeconds()/s,Z=L/s,F=u.axes[w]._space,X=N/F;for(;P=oe(P+L,e==1?0:3),!(P>M);)if(Z>1){let O=Ke(oe(re+Z,6))%24,Fe=y(P).getHours()-O;Fe>1&&(Fe=-1),P-=Fe*s,re=(re+Z)%24;let H=E[E.length-1];oe((P-H)/L,3)*X>=.7&&E.push(P)}else E.push(P)}return E}}return[d,g,_]}var[sa,ia,ra]=Fi(1),[oa,aa,ua]=Fi(.001);vl(2,-53,53,[1]);function ui(e,t){return e.map(n=>n.map((s,r)=>r==0||r==8||s==null?s:t(r==1||n[8]==0?s:n[1]+s)))}function ci(e,t){return(n,s,r,f,c)=>{let m=t.find(x=>c>=x[0])||t[t.length-1],d,g,_,y,u,w;return s.map(x=>{let M=e(x),L=M.getFullYear(),N=M.getMonth(),E=M.getDate(),v=M.getHours(),C=M.getMinutes(),D=M.getSeconds(),R=L!=d&&m[2]||N!=g&&m[3]||E!=_&&m[4]||v!=y&&m[5]||C!=u&&m[6]||D!=w&&m[7]||m[1];return d=L,g=N,_=E,y=v,u=C,w=D,R(M)})}}function ca(e,t){let n=jn(t);return(s,r,f,c,m)=>r.map(d=>n(e(d)))}function zn(e,t,n){return new Date(e,t,n)}function fi(e,t){return t(e)}var fa="{YYYY}-{MM}-{DD} {h}:{mm}{aa}";function hi(e,t){return(n,s)=>t(e(s))}function ha(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null}function da(e,t){return e.series[t].fill(e,t)}var pa={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:ha,fill:da,dash:"solid"},idx:null,idxs:null,values:[]};function ma(e,t){let n=e.cursor.points,s=et(),r=n.size(e,t);ce(s,pl,r),ce(s,ml,r);let f=r/-2;ce(s,"marginLeft",f),ce(s,"marginTop",f);let c=n.width(e,t,r);return c&&ce(s,"borderWidth",c),s}function ga(e,t){let n=e.series[t].points;return n._fill||n._stroke}function wa(e,t){let n=e.series[t].points;return n._stroke||n._fill}function Sa(e,t){let n=e.series[t].points;return Wi(n.width,1)}function va(e,t,n){return n}var Vn=[0,0];function _a(e,t,n){return Vn[0]=t,Vn[1]=n,Vn}function Wl(e,t,n){return s=>{s.button==0&&n(s)}}function Fn(e,t,n){return n}var ya={show:!0,x:!0,y:!0,lock:!1,move:_a,points:{show:ma,size:Sa,width:0,stroke:wa,fill:ga},bind:{mousedown:Wl,mouseup:Wl,click:Wl,dblclick:Wl,mousemove:Fn,mouseleave:Fn,mouseenter:Fn},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:va,idxs:null},Ni={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Zn=we({},Ni,{filter:Mi}),Oi=we({},Zn,{size:10}),Hi=we({},Ni,{show:!1}),Qn='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Ii="bold "+Qn,ba=1.5,di={show:!0,scale:"x",stroke:Yn,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:2,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0},xa="Value",ka="Time",pi={show:!0,scale:"x",auto:!1,sorted:1,min:Q,max:-Q,idxs:[]};function Ma(e,t,n,s,r){return t.map(f=>f==null?"":$n(f))}function Ta(e,t,n,s,r,f,c){let m=[],d=Kl.get(r)||0;n=c?n:oe(Pt(n,r),d);for(let g=n;g<=s;g=oe(g+r,d))m.push(Object.is(g,-0)?0:g);return m}function Wn(e,t,n,s,r,f,c){let m=[],d=e.scales[e.axes[t].scale].log,g=d==10?Et:ki,_=Ke(g(n));r=_t(d,_),_<0&&(r=oe(r,-_));let y=n;do m.push(y),y=oe(y+r,Kl.get(r)),y>=r*d&&(r=y);while(y<=s);return m}function Da(e,t,n,s,r,f,c){let d=e.scales[e.axes[t].scale].asinh,g=s>d?Wn(e,t,Le(d,n),s,r):[d],_=s>=0&&n<=0?[0]:[];return(n<-d?Wn(e,t,Le(d,-s),-n,r):[d]).reverse().map(u=>-u).concat(_,g)}var Ca=/./,Ea=/[12357]/,Pa=/[125]/,Aa=/1/;function La(e,t,n,s,r){let f=e.axes[n],c=f.scale,m=e.scales[c];if(m.distr==3&&m.log==2)return t;let d=e.valToPos,g=f._space,_=d(10,c),y=d(9,c)-_>=g?Ca:d(7,c)-_>=g?Ea:d(5,c)-_>=g?Pa:Aa;return t.map(u=>m.distr==4&&u==0||y.test(u)?u:null)}function Ra(e,t){return t==null?"":$n(t)}var mi={show:!0,scale:"y",stroke:Yn,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:3,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0};function Wi(e,t){let n=3+(e||1)*2;return oe(n*t,3)}function za(e,t){let{scale:n,idxs:s}=e.series[0],r=e._data[0],f=e.valToPos(r[s[0]],n,!0),c=e.valToPos(r[s[1]],n,!0),m=Ye(c-f),d=e.series[t],g=m/(d.points.space*te);return s[1]-s[0]<=g}var gi={scale:null,auto:!0,sorted:0,min:Q,max:-Q},Va={show:!0,auto:!0,sorted:0,alpha:1,facets:[we({},gi,{scale:"x"}),we({},gi,{scale:"y"})]},wi={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:(e,t,n,s,r)=>r,alpha:1,points:{show:za,filter:null},values:null,min:Q,max:-Q,idxs:[],path:null,clip:null};function Fa(e,t,n,s,r){return n/10}var Bi={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Na=we({},Bi,{time:!1,ori:1}),Si={};function Yi(e,t){let n=Si[e];return n||(n={key:e,plots:[],sub(s){n.plots.push(s)},unsub(s){n.plots=n.plots.filter(r=>r!=s)},pub(s,r,f,c,m,d,g){for(let _=0;_{let N=c.pxRound,E=g.dir*(g.ori==0?1:-1),v=g.ori==0?Jt:Zt,C,D;E==1?(C=n,D=s):(C=s,D=n);let R=N(y(m[C],g,M,w)),A=N(u(d[C],_,L,x)),W=N(y(m[D],g,M,w)),Y=N(u(f==1?_.max:_.min,_,L,x)),$=new Path2D(r);return v($,W,Y),v($,R,Y),v($,R,A),$})}function Zl(e,t,n,s,r,f){let c=null;if(e.length>0){c=new Path2D;let m=t==0?en:es,d=n;for(let _=0;_y[0]){let u=y[0]-d;u>0&&m(c,d,s,u,s+f),d=y[1]}}let g=n+r-d;g>0&&m(c,d,s,g,s+f)}return c}function Ha(e,t,n){let s=e[e.length-1];s&&s[0]==t?s[1]=n:e.push([t,n])}function Xn(e,t,n,s,r,f,c){let m=[];for(let d=r==1?n:s;d>=n&&d<=s;d+=r)if(t[d]===null){let _=d,y=d;if(r==1)for(;++d<=s&&t[d]===null;)y=d;else for(;--d>=n&&t[d]===null;)y=d;let u=f(e[_]),w=y==_?u:f(e[y]);u=c<=0?f(e[_-r]):u,w=c>=0?f(e[y+r]):w,w>=u&&m.push([u,w])}return m}function vi(e){return e==0?No:e==1?Me:t=>Mt(t,e)}function Gi(e){let t=e==0?Ql:Xl,n=e==0?(r,f,c,m,d,g)=>{r.arcTo(f,c,m,d,g)}:(r,f,c,m,d,g)=>{r.arcTo(c,f,d,m,g)},s=e==0?(r,f,c,m,d)=>{r.rect(f,c,m,d)}:(r,f,c,m,d)=>{r.rect(c,f,d,m)};return(r,f,c,m,d,g=0)=>{g==0?s(r,f,c,m,d):(g=Ge(g,m/2,d/2),t(r,f+g,c),n(r,f+m,c,f+m,c+d,g),n(r,f+m,c+d,f,c+d,g),n(r,f,c+d,f,c,g),n(r,f,c,f+m,c,g),r.closePath())}}var Ql=(e,t,n)=>{e.moveTo(t,n)},Xl=(e,t,n)=>{e.moveTo(n,t)},Jt=(e,t,n)=>{e.lineTo(t,n)},Zt=(e,t,n)=>{e.lineTo(n,t)},en=Gi(0),es=Gi(1),qi=(e,t,n,s,r,f)=>{e.arc(t,n,s,r,f)},Ui=(e,t,n,s,r,f)=>{e.arc(n,t,s,r,f)},$i=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(t,n,s,r,f,c)},Ki=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(n,t,r,s,c,f)};function ji(e){return(t,n,s,r,f)=>Rt(t,n,(c,m,d,g,_,y,u,w,x,M,L)=>{let{pxRound:N,points:E}=c,v,C;g.ori==0?(v=Ql,C=qi):(v=Xl,C=Ui);let D=oe(E.width*te,3),R=(E.size-E.width)/2*te,A=oe(R*2,3),W=new Path2D,Y=new Path2D,{left:$,top:P,width:U,height:re}=t.bbox;en(Y,$-A,P-A,U+A*2,re+A*2);let Z=F=>{if(d[F]!=null){let X=N(y(m[F],g,M,w)),O=N(u(d[F],_,L,x));v(W,X+R,O),C(W,X,O,R,0,Bl*2)}};if(f)f.forEach(Z);else for(let F=s;F<=r;F++)Z(F);return{stroke:D>0?W:null,fill:W,clip:Y,flags:Lt|Ul}})}function Ji(e){return(t,n,s,r,f,c)=>{s!=r&&(f!=s&&c!=s&&e(t,n,s),f!=r&&c!=r&&e(t,n,r),e(t,n,c))}}var Ia=Ji(Jt),Wa=Ji(Zt);function Zi(e){let t=le(e?.alignGaps,0);return(n,s,r,f)=>Rt(n,s,(c,m,d,g,_,y,u,w,x,M,L)=>{let N=c.pxRound,E=H=>N(y(H,g,M,w)),v=H=>N(u(H,_,L,x)),C,D;g.ori==0?(C=Jt,D=Ia):(C=Zt,D=Wa);let R=g.dir*(g.ori==0?1:-1),A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=Q,$=-Q,P,U,re,Z=E(m[R==1?r:f]),F=$t(d,r,f,1*R),X=$t(d,r,f,-1*R),O=E(m[F]),Re=E(m[X]);for(let H=R==1?r:f;H>=r&&H<=f;H+=R){let I=E(m[H]);I==Z?d[H]!=null&&(U=v(d[H]),Y==Q&&(C(W,I,U),P=U),Y=Ge(U,Y),$=Le(U,$)):(Y!=Q&&(D(W,Z,Y,$,P,U),re=Z),d[H]!=null?(U=v(d[H]),C(W,I,U),Y=$=P=U):(Y=Q,$=-Q),Z=I)}Y!=Q&&Y!=$&&re!=Z&&D(W,Z,Y,$,P,U);let[Te,Fe]=Jl(n,s);if(c.fill!=null||Te!=0){let H=A.fill=new Path2D(W),I=c.fillTo(n,s,c.min,c.max,Te),De=v(I);C(H,Re,De),C(H,O,De)}if(!c.spanGaps){let H=[];H.push(...Xn(m,d,r,f,R,E,t)),A.gaps=H=c.gaps(n,s,r,f,H),A.clip=Zl(H,g.ori,w,x,M,L)}return Fe!=0&&(A.band=Fe==2?[ft(n,s,r,f,W,-1),ft(n,s,r,f,W,1)]:ft(n,s,r,f,W,Fe)),A})}function Ba(e){let t=le(e.align,1),n=le(e.ascDesc,!1),s=le(e.alignGaps,0);return(r,f,c,m)=>Rt(r,f,(d,g,_,y,u,w,x,M,L,N,E)=>{let v=d.pxRound,C=F=>v(w(F,y,N,M)),D=F=>v(x(F,u,E,L)),R=y.ori==0?Jt:Zt,A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=y.dir*(y.ori==0?1:-1);c=$t(_,c,m,1),m=$t(_,c,m,-1);let $=D(_[Y==1?c:m]),P=C(g[Y==1?c:m]),U=P;R(W,P,$);for(let F=Y==1?c:m;F>=c&&F<=m;F+=Y){let X=_[F];if(X==null)continue;let O=C(g[F]),Re=D(X);t==1?R(W,O,$):R(W,U,Re),R(W,O,Re),$=Re,U=O}let[re,Z]=Jl(r,f);if(d.fill!=null||re!=0){let F=A.fill=new Path2D(W),X=d.fillTo(r,f,d.min,d.max,re),O=D(X);R(F,U,O),R(F,P,O)}if(!d.spanGaps){let F=[];F.push(...Xn(g,_,c,m,Y,C,s));let X=d.width*te/2,O=n||t==1?X:-X,Re=n||t==-1?-X:X;F.forEach(Te=>{Te[0]+=O,Te[1]+=Re}),A.gaps=F=d.gaps(r,f,c,m,F),A.clip=Zl(F,y.ori,M,L,N,E)}return Z!=0&&(A.band=Z==2?[ft(r,f,c,m,W,-1),ft(r,f,c,m,W,1)]:ft(r,f,c,m,W,Z)),A})}function Ya(e){e=e||Sl;let t=le(e.size,[.6,Q,1]),n=e.align||0,s=(e.gap||0)*te,r=le(e.radius,0),f=1-t[0],c=le(t[1],Q)*te,m=le(t[2],1)*te,d=le(e.disp,Sl),g=le(e.each,u=>{}),{fill:_,stroke:y}=d;return(u,w,x,M)=>Rt(u,w,(L,N,E,v,C,D,R,A,W,Y,$)=>{let P=L.pxRound,U=v.dir*(v.ori==0?1:-1),re=C.dir*(C.ori==1?1:-1),Z=v.ori==0?en:es,F=v.ori==0?g:(ne,Ne,qe,G,j,pe,_e)=>{g(ne,Ne,qe,j,G,_e,pe)},[X,O]=Jl(u,w),Re=C.distr==3?X==1?C.max:C.min:0,Te=R(Re,C,$,W),Fe,H,I=P(L.width*te),De=!1,de=null,Je=null,st=null,ht=null;_!=null&&(I==0||y!=null)&&(De=!0,de=_.values(u,w,x,M),Je=new Map,new Set(de).forEach(ne=>{ne!=null&&Je.set(ne,new Path2D)}),I>0&&(st=y.values(u,w,x,M),ht=new Map,new Set(st).forEach(ne=>{ne!=null&&ht.set(ne,new Path2D)})));let{x0:dt,size:Ze}=d;if(dt!=null&&Ze!=null){N=dt.values(u,w,x,M),dt.unit==2&&(N=N.map(Ne=>u.posToVal(A+Ne*Y,v.key,!0)));let ne=Ze.values(u,w,x,M);Ze.unit==2?H=ne[0]*Y:H=D(ne[0],v,Y,A)-D(0,v,Y,A),H=P(H-I),Fe=U==1?-I/2:H+I/2}else{let ne=Y;if(N.length>1){let qe=null;for(let G=0,j=1/0;G=x&&ne<=M;ne+=U){let Ne=E[ne];if(Ne===void 0)continue;let qe=v.distr!=2||d!=null?N[ne]:ne,G=D(qe,v,Y,A),j=R(le(Ne,Re),C,$,W);Qe!=null&&Ne!=null&&(Te=R(Qe[ne],C,$,W));let pe=P(G-Fe),_e=P(Le(j,Te)),ye=P(Ge(j,Te)),He=_e-ye,tt=r*H;Ne!=null&&(De?(I>0&&st[ne]!=null&&Z(ht.get(st[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt),de[ne]!=null&&Z(Je.get(de[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt)):Z(Vt,pe,ye+Ke(I/2),H,Le(0,He-I),tt),F(u,w,ne,pe-I/2,ye,H+I,He)),O!=0&&(re*O==1?(_e=ye,ye=Qt):(ye=_e,_e=Qt),He=_e-ye,Z(on,pe-I/2,ye,H+I,Le(0,He),0))}return I>0&&(ot.stroke=De?ht:Vt),ot.fill=De?Je:Vt,ot})}function Ga(e,t){let n=le(t?.alignGaps,0);return(s,r,f,c)=>Rt(s,r,(m,d,g,_,y,u,w,x,M,L,N)=>{let E=m.pxRound,v=O=>E(u(O,_,L,x)),C=O=>E(w(O,y,N,M)),D,R,A;_.ori==0?(D=Ql,A=Jt,R=$i):(D=Xl,A=Zt,R=Ki);let W=_.dir*(_.ori==0?1:-1);f=$t(g,f,c,1),c=$t(g,f,c,-1);let Y=v(d[W==1?f:c]),$=Y,P=[],U=[];for(let O=W==1?f:c;O>=f&&O<=c;O+=W)if(g[O]!=null){let Te=d[O],Fe=v(Te);P.push($=Fe),U.push(C(g[O]))}let re={stroke:e(P,U,D,A,R,E),fill:null,clip:null,band:null,gaps:null,flags:Lt},Z=re.stroke,[F,X]=Jl(s,r);if(m.fill!=null||F!=0){let O=re.fill=new Path2D(Z),Re=m.fillTo(s,r,m.min,m.max,F),Te=C(Re);A(O,$,Te),A(O,Y,Te)}if(!m.spanGaps){let O=[];O.push(...Xn(d,g,f,c,W,v,n)),re.gaps=O=m.gaps(s,r,f,c,O),re.clip=Zl(O,_.ori,x,M,L,N)}return X!=0&&(re.band=X==2?[ft(s,r,f,c,Z,-1),ft(s,r,f,c,Z,1)]:ft(s,r,f,c,Z,X)),re})}function qa(e){return Ga(Ua,e)}function Ua(e,t,n,s,r,f){let c=e.length;if(c<2)return null;let m=new Path2D;if(n(m,e[0],t[0]),c==2)s(m,e[1],t[1]);else{let d=Array(c),g=Array(c-1),_=Array(c-1),y=Array(c-1);for(let u=0;u0!=g[u]>0?d[u]=0:(d[u]=3*(y[u-1]+y[u])/((2*y[u]+y[u-1])/g[u-1]+(y[u]+2*y[u-1])/g[u]),isFinite(d[u])||(d[u]=0));d[c-1]=g[c-2];for(let u=0;u{e.syncRect(!0)})}jt&&(Ct(Mo,Ut,_i),Ct(To,Ut,_i,!0),Ct(Yl,Ut,()=>{Se.pxRatio=te}));var $a=Zi(),Ka=ji();function yi(e,t,n,s){return(s?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((f,c)=>Qi(f,c,t,n))}function ja(e,t){return e.map((n,s)=>s==0?null:we({},t,n))}function Qi(e,t,n,s){return we({},t==0?n:s,e)}function Xi(e,t,n){return t==null?Kt:[t,n]}var Ja=Xi;function Za(e,t,n){return t==null?Kt:Gl(t,n,Un,!0)}function er(e,t,n,s){return t==null?Kt:$l(t,n,e.scales[s].log,!1)}var Qa=er;function tr(e,t,n,s){return t==null?Kt:qn(t,n,e.scales[s].log,!1)}var Xa=tr;function eu(e,t,n,s,r){let f=Le(ei(e),ei(t)),c=t-e,m=vt(r/s*c,n);do{let d=n[m],g=s*d/c;if(g>=r&&f+(d<5?Kl.get(d):0)<=17)return[d,g]}while(++m(t=Me((n=+r)*te))+"px"),[e,t,n]}function tu(e){e.show&&[e.font,e.labelFont].forEach(t=>{let n=oe(t[2]*te,1);t[0]=t[0].replace(/[0-9.]+px/,n+"px"),t[1]=n})}function Se(e,t,n){let s={mode:le(e.mode,1)},r=s.mode;function f(l,i){return((i.distr==3?Et(l>0?l:i.clamp(s,l,i.min,i.max,i.key)):i.distr==4?Rn(l,i.asinh):l)-i._min)/(i._max-i._min)}function c(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?1-h:h)}function m(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?h:1-h)}function d(l,i,o,a){return i.ori==0?c(l,i,o,a):m(l,i,o,a)}s.valToPosH=c,s.valToPosV=m;let g=!1;s.status=0;let _=s.root=et(io);if(e.id!=null&&(_.id=e.id),$e(_,e.class),e.title){let l=et(ao,_);l.textContent=e.title}let y=ct("canvas"),u=s.ctx=y.getContext("2d"),w=et(uo,_),x=s.under=et(co,w);w.appendChild(y);let M=s.over=et(fo,w);e=At(e);let L=+le(e.pxAlign,1),N=vi(L);(e.plugins||[]).forEach(l=>{l.opts&&(e=l.opts(s,e)||e)});let E=e.ms||.001,v=s.series=r==1?yi(e.series||[],pi,wi,!1):ja(e.series||[null],Va),C=s.axes=yi(e.axes||[],di,mi,!0),D=s.scales={},R=s.bands=e.bands||[];R.forEach(l=>{l.fill=ee(l.fill||null),l.dir=le(l.dir,-1)});let A=r==2?v[1].facets[0].scale:v[0].scale,W={axes:Fr,series:Ar},Y=(e.drawOrder||["axes","series"]).map(l=>W[l]);function $(l){let i=D[l];if(i==null){let o=(e.scales||Sl)[l]||Sl;if(o.from!=null)$(o.from),D[l]=we({},D[o.from],o,{key:l});else{i=D[l]=we({},l==A?Bi:Na,o),i.key=l;let a=i.time,h=i.range,p=Dt(h);if((l!=A||r==2&&!a)&&(p&&(h[0]==null||h[1]==null)&&(h={min:h[0]==null?Qs:{mode:1,hard:h[0],soft:h[0]},max:h[1]==null?Qs:{mode:1,hard:h[1],soft:h[1]}},p=!1),!p&&jl(h))){let S=h;h=(b,T,V)=>T==null?Kt:Gl(T,V,S)}i.range=ee(h||(a?Ja:l==A?i.distr==3?Qa:i.distr==4?Xa:Xi:i.distr==3?er:i.distr==4?tr:Za)),i.auto=ee(p?!1:i.auto),i.clamp=ee(i.clamp||Fa),i._min=i._max=null}}}$("x"),$("y"),r==1&&v.forEach(l=>{$(l.scale)}),C.forEach(l=>{$(l.scale)});for(let l in e.scales)$(l);let P=D[A],U=P.distr,re,Z;P.ori==0?($e(_,ro),re=c,Z=m):($e(_,oo),re=m,Z=c);let F={};for(let l in D){let i=D[l];(i.min!=null||i.max!=null)&&(F[l]={min:i.min,max:i.max},i.min=i.max=null)}let X=e.tzDate||(l=>new Date(Me(l/E))),O=e.fmtDate||jn,Re=E==1?ra(X):ua(X),Te=ci(X,ui(E==1?ia:aa,O)),Fe=hi(X,fi(fa,O)),H=[],I=s.legend=we({},pa,e.legend),De=I.show,de=I.markers;I.idxs=H,de.width=ee(de.width),de.dash=ee(de.dash),de.stroke=ee(de.stroke),de.fill=ee(de.fill);let Je,st=[],ht=[],dt,Ze=!1,ot={};if(I.live){let l=v[1]?v[1].values:null;Ze=l!=null,dt=Ze?l(s,1,0):{_:0};for(let i in dt)ot[i]="--"}if(De)if(Je=ct("table",So,_),Ze){let l=ct("tr",yo,Je);ct("th",null,l);for(var Qt in dt)ct("th",Hs,l).textContent=Qt}else $e(Je,_o),I.live&&$e(Je,vo);let Vt={show:!0},on={show:!1};function bl(l,i){if(i==0&&(Ze||!I.live||r==2))return Kt;let o=[],a=ct("tr",bo,Je,Je.childNodes[i]);$e(a,l.class),l.show||$e(a,Tt);let h=ct("th",null,a);if(de.show){let b=et(xo,h);if(i>0){let T=de.width(s,i);T&&(b.style.border=T+"px "+de.dash(s,i)+" "+de.stroke(s,i)),b.style.background=de.fill(s,i)}}let p=et(Hs,h);p.textContent=l.label,i>0&&(de.show||(p.style.color=l.width>0?de.stroke(s,i):de.fill(s,i)),Qe("click",h,b=>{if(B._lock)return;let T=v.indexOf(l);if((b.ctrlKey||b.metaKey)!=I.isolate){let V=v.some((k,z)=>z>0&&z!=T&&k.show);v.forEach((k,z)=>{z>0&&rt(z,V?z==T?Vt:on:Vt,!0,Ae.setSeries)})}else rt(T,{show:!l.show},!0,Ae.setSeries)}),Ml&&Qe(Gs,h,b=>{B._lock||rt(v.indexOf(l),Ht,!0,Ae.setSeries)}));for(var S in dt){let b=ct("td",ko,a);b.textContent="--",o.push(b)}return[a,o]}let pt=new Map;function Qe(l,i,o){let a=pt.get(i)||{},h=B.bind[l](s,i,o);h&&(Ct(l,i,a[l]=h),pt.set(i,a))}function ne(l,i,o){let a=pt.get(i)||{};for(let h in a)(l==null||h==l)&&(In(h,i,a[h]),delete a[h]);l==null&&pt.delete(i)}let Ne=0,qe=0,G=0,j=0,pe=0,_e=0,ye=0,He=0,tt=0,yt=0;s.bbox={};let an=!1,xl=!1,Ft=!1,Xt=!1,it=!1;function un(l,i,o){(o||l!=s.width||i!=s.height)&&rs(l,i),ll(!1),Ft=!0,xl=!0,Xt=it=B.left>=0,xt()}function rs(l,i){s.width=Ne=G=l,s.height=qe=j=i,pe=_e=0,xr(),kr();let o=s.bbox;ye=o.left=Mt(pe*te,.5),He=o.top=Mt(_e*te,.5),tt=o.width=Mt(G*te,.5),yt=o.height=Mt(j*te,.5)}let _r=3;function yr(){let l=!1,i=0;for(;!l;){i++;let o=zr(i),a=Vr(i);l=i==_r||o&&a,l||(rs(s.width,s.height),xl=!0)}}function br({width:l,height:i}){un(l,i)}s.setSize=br;function xr(){let l=!1,i=!1,o=!1,a=!1;C.forEach((h,p)=>{if(h.show&&h._show){let{side:S,_size:b}=h,T=S%2,V=h.label!=null?h.labelSize:0,k=b+V;k>0&&(T?(G-=k,S==3?(pe+=k,a=!0):o=!0):(j-=k,S==0?(_e+=k,l=!0):i=!0))}}),bt[0]=l,bt[1]=o,bt[2]=i,bt[3]=a,G-=mt[1]+mt[3],pe+=mt[3],j-=mt[2]+mt[0],_e+=mt[0]}function kr(){let l=pe+G,i=_e+j,o=pe,a=_e;function h(p,S){switch(p){case 1:return l+=S,l-S;case 2:return i+=S,i-S;case 3:return o-=S,o+S;case 0:return a-=S,a+S}}C.forEach((p,S)=>{if(p.show&&p._show){let b=p.side;p._pos=h(b,p._size),p.label!=null&&(p._lpos=h(b,p.labelSize))}})}let B=s.cursor=we({},ya,{drag:{y:r==2}},e.cursor);{B.idxs=H,B._lock=!1;let l=B.points;l.show=ee(l.show),l.size=ee(l.size),l.stroke=ee(l.stroke),l.width=ee(l.width),l.fill=ee(l.fill)}let kl=s.focus=we({},e.focus||{alpha:.3},B.focus),Ml=kl.prox>=0,Ie=[null];function Mr(l,i){if(i>0){let o=B.points.show(s,i);if(o)return $e(o,wo),$e(o,l.class),Gt(o,-10,-10,G,j),M.insertBefore(o,Ie[i]),o}}function os(l,i){if(r==1||i>0){let o=r==1&&D[l.scale].time,a=l.value;l.value=o?si(a)?hi(X,fi(a,O)):a||Fe:a||Ra,l.label=l.label||(o?ka:xa)}if(i>0){l.width=l.width==null?1:l.width,l.paths=l.paths||$a||Oo,l.fillTo=ee(l.fillTo||Oa),l.pxAlign=+le(l.pxAlign,L),l.pxRound=vi(l.pxAlign),l.stroke=ee(l.stroke||null),l.fill=ee(l.fill||null),l._stroke=l._fill=l._paths=l._focus=null;let o=Wi(l.width,1),a=l.points=we({},{size:o,width:Le(1,o*.2),stroke:l.stroke,space:o*2,paths:Ka,_stroke:null,_fill:null},l.points);a.show=ee(a.show),a.filter=ee(a.filter),a.fill=ee(a.fill),a.stroke=ee(a.stroke),a.paths=ee(a.paths),a.pxAlign=l.pxAlign}if(De){let o=bl(l,i);st.splice(i,0,o[0]),ht.splice(i,0,o[1]),I.values.push(null)}if(B.show){H.splice(i,0,null);let o=Mr(l,i);o&&Ie.splice(i,0,o)}Pe("addSeries",i)}function Tr(l,i){i=i??v.length,l=Qi(l,i,pi,wi),v.splice(i,0,l),os(v[i],i)}s.addSeries=Tr;function Dr(l){if(v.splice(l,1),De){I.values.splice(l,1),ht.splice(l,1);let i=st.splice(l,1)[0];ne(null,i.firstChild),i.remove()}B.show&&(H.splice(l,1),Ie.length>1&&Ie.splice(l,1)[0].remove()),Pe("delSeries",l)}s.delSeries=Dr;let bt=[!1,!1,!1,!1];function Cr(l,i){if(l._show=l.show,l.show){let o=l.side%2,a=D[l.scale];a==null&&(l.scale=o?v[1].scale:A,a=D[l.scale]);let h=a.time;l.size=ee(l.size),l.space=ee(l.space),l.rotate=ee(l.rotate),l.incrs=ee(l.incrs||(a.distr==2?ta:h?E==1?sa:oa:la)),l.splits=ee(l.splits||(h&&a.distr==1?Re:a.distr==3?Wn:a.distr==4?Da:Ta)),l.stroke=ee(l.stroke),l.grid.stroke=ee(l.grid.stroke),l.ticks.stroke=ee(l.ticks.stroke),l.border.stroke=ee(l.border.stroke);let p=l.values;l.values=Dt(p)&&!Dt(p[0])?ee(p):h?Dt(p)?ci(X,ui(p,O)):si(p)?ca(X,p):p||Te:p||Ma,l.filter=ee(l.filter||(a.distr>=3?La:Mi)),l.font=bi(l.font),l.labelFont=bi(l.labelFont),l._size=l.size(s,null,i,0),l._space=l._rotate=l._incrs=l._found=l._splits=l._values=null,l._size>0&&(bt[i]=!0,l._el=et(ho,w))}}function el(l,i,o,a){let[h,p,S,b]=o,T=i%2,V=0;return T==0&&(b||p)&&(V=i==0&&!h||i==2&&!S?Me(di.size/3):0),T==1&&(h||S)&&(V=i==1&&!p||i==3&&!b?Me(mi.size/2):0),V}let as=s.padding=(e.padding||[el,el,el,el]).map(l=>ee(le(l,el))),mt=s._padding=as.map((l,i)=>l(s,i,bt,0)),be,Ce=null,Ee=null,Tl=r==1?v[0].idxs:null,lt=null,Dl=!1;function us(l,i){if(t=l==null?[]:At(l,ii),r==2){be=0;for(let o=1;o=0,it=!0,xt()}}s.setData=us;function cn(){Dl=!0;let l,i;r==1&&(be>0?(Ce=Tl[0]=0,Ee=Tl[1]=be-1,l=t[0][Ce],i=t[0][Ee],U==2?(l=Ce,i=Ee):be==1&&(U==3?[l,i]=$l(l,l,P.log,!1):U==4?[l,i]=qn(l,l,P.log,!1):P.time?i=l+Me(86400/E):[l,i]=Gl(l,i,Un,!0))):(Ce=Tl[0]=l=null,Ee=Tl[1]=i=null)),Ot(A,l,i)}let Cl,Nt,fn,hn,dn,pn,mn,gn,wn,tl;function cs(l=Ws,i,o=Di,a="butt",h=Ws,p="round"){l!=Cl&&(u.strokeStyle=Cl=l),h!=Nt&&(u.fillStyle=Nt=h),i!=fn&&(u.lineWidth=fn=i),p!=dn&&(u.lineJoin=dn=p),a!=pn&&(u.lineCap=pn=a),o!=hn&&u.setLineDash(hn=o)}function fs(l,i,o,a){i!=Nt&&(u.fillStyle=Nt=i),l!=mn&&(u.font=mn=l),o!=gn&&(u.textAlign=gn=o),a!=wn&&(u.textBaseline=wn=a)}function Sn(l,i,o,a,h=0){if(a.length>0&&l.auto(s,Dl)&&(i==null||i.min==null)){let p=le(Ce,0),S=le(Ee,a.length-1),b=o.min==null?l.distr==3?Ao(a,p,S):Po(a,p,S,h):[o.min,o.max];l.min=Ge(l.min,o.min=b[0]),l.max=Le(l.max,o.max=b[1])}}function Er(){let l=At(D,ii);for(let a in l){let h=l[a],p=F[a];if(p!=null&&p.min!=null)we(h,p),a==A&&ll(!0);else if(a!=A||r==2)if(be==0&&h.from==null){let S=h.range(s,null,null,a);h.min=S[0],h.max=S[1]}else h.min=Q,h.max=-Q}if(be>0){v.forEach((a,h)=>{if(r==1){let p=a.scale,S=l[p],b=F[p];if(h==0){let T=S.range(s,S.min,S.max,p);S.min=T[0],S.max=T[1],Ce=vt(S.min,t[0]),Ee=vt(S.max,t[0]),t[0][Ce]S.max&&Ee--,a.min=lt[Ce],a.max=lt[Ee]}else a.show&&a.auto&&Sn(S,b,a,t[h],a.sorted);a.idxs[0]=Ce,a.idxs[1]=Ee}else if(h>0&&a.show&&a.auto){let[p,S]=a.facets,b=p.scale,T=S.scale,[V,k]=t[h];Sn(l[b],F[b],p,V,p.sorted),Sn(l[T],F[T],S,k,S.sorted),a.min=S.min,a.max=S.max}});for(let a in l){let h=l[a],p=F[a];if(h.from==null&&(p==null||p.min==null)){let S=h.range(s,h.min==Q?null:h.min,h.max==-Q?null:h.max,a);h.min=S[0],h.max=S[1]}}}for(let a in l){let h=l[a];if(h.from!=null){let p=l[h.from];if(p.min==null)h.min=h.max=null;else{let S=h.range(s,p.min,p.max,a);h.min=S[0],h.max=S[1]}}}let i={},o=!1;for(let a in l){let h=l[a],p=D[a];if(p.min!=h.min||p.max!=h.max){p.min=h.min,p.max=h.max;let S=p.distr;p._min=S==3?Et(p.min):S==4?Rn(p.min,p.asinh):p.min,p._max=S==3?Et(p.max):S==4?Rn(p.max,p.asinh):p.max,i[a]=o=!0}}if(o){v.forEach((a,h)=>{r==2?h>0&&i.y&&(a._paths=null):i[a.scale]&&(a._paths=null)});for(let a in i)Ft=!0,Pe("setScale",a);B.show&&(Xt=it=B.left>=0)}for(let a in F)F[a]=null}function Pr(l){let i=ti(Ce-1,0,be-1),o=ti(Ee+1,0,be-1);for(;l[i]==null&&i>0;)i--;for(;l[o]==null&&o0&&(v.forEach((l,i)=>{if(i>0&&l.show&&l._paths==null){let o=Pr(t[i]);l._paths=l.paths(s,i,o[0],o[1])}}),v.forEach((l,i)=>{if(i>0&&l.show){tl!=l.alpha&&(u.globalAlpha=tl=l.alpha),hs(i,!1),l._paths&&ds(i,!1);{hs(i,!0);let o=l.points.show(s,i,Ce,Ee),a=l.points.filter(s,i,o,l._paths?l._paths.gaps:null);(o||a)&&(l.points._paths=l.points.paths(s,i,Ce,Ee,a),ds(i,!0))}tl!=1&&(u.globalAlpha=tl=1),Pe("drawSeries",i)}}))}function hs(l,i){let o=i?v[l].points:v[l];o._stroke=o.stroke(s,l),o._fill=o.fill(s,l)}function ds(l,i){let o=i?v[l].points:v[l],a=o._stroke,h=o._fill,{stroke:p,fill:S,clip:b,flags:T}=o._paths,V=null,k=oe(o.width*te,3),z=k%2/2;i&&h==null&&(h=k>0?"#fff":a);let q=o.pxAlign==1;if(q&&u.translate(z,z),!i){let me=ye,K=He,ae=tt,J=yt,se=k*te/2;o.min==0&&(J+=se),o.max==0&&(K-=se,J+=se),V=new Path2D,V.rect(me,K,ae,J)}i?vn(a,k,o.dash,o.cap,h,p,S,T,b):Lr(l,a,k,o.dash,o.cap,h,p,S,T,V,b),q&&u.translate(-z,-z)}function Lr(l,i,o,a,h,p,S,b,T,V,k){let z=!1;R.forEach((q,me)=>{if(q.series[0]==l){let K=v[q.series[1]],ae=t[q.series[1]],J=(K._paths||Sl).band;Dt(J)&&(J=q.dir==1?J[0]:J[1]);let se,ge=null;K.show&&J&&Ro(ae,Ce,Ee)?(ge=q.fill(s,me)||p,se=K._paths.clip):J=null,vn(i,o,a,h,ge,S,b,T,V,k,se,J),z=!0}}),z||vn(i,o,a,h,p,S,b,T,V,k)}let ps=Lt|Ul;function vn(l,i,o,a,h,p,S,b,T,V,k,z){cs(l,i,o,a,h),(T||V||z)&&(u.save(),T&&u.clip(T),V&&u.clip(V)),z?(b&ps)==ps?(u.clip(z),k&&u.clip(k),Pl(h,S),El(l,p,i)):b&Ul?(Pl(h,S),u.clip(z),El(l,p,i)):b&Lt&&(u.save(),u.clip(z),k&&u.clip(k),Pl(h,S),u.restore(),El(l,p,i)):(Pl(h,S),El(l,p,i)),(T||V||z)&&u.restore()}function El(l,i,o){o>0&&(i instanceof Map?i.forEach((a,h)=>{u.strokeStyle=Cl=h,u.stroke(a)}):i!=null&&l&&u.stroke(i))}function Pl(l,i){i instanceof Map?i.forEach((o,a)=>{u.fillStyle=Nt=a,u.fill(o)}):i!=null&&l&&u.fill(i)}function Rr(l,i,o,a){let h=C[l],p;if(a<=0)p=[0,0];else{let S=h._space=h.space(s,l,i,o,a),b=h._incrs=h.incrs(s,l,i,o,a,S);p=eu(i,o,b,a,S)}return h._found=p}function _n(l,i,o,a,h,p,S,b,T,V){let k=S%2/2;L==1&&u.translate(k,k),cs(b,S,T,V,b),u.beginPath();let z,q,me,K,ae=h+(a==0||a==3?-p:p);o==0?(q=h,K=ae):(z=h,me=ae);for(let J=0;J{if(!o.show)return;let h=D[o.scale];if(h.min==null){o._show&&(i=!1,o._show=!1,ll(!1));return}else o._show||(i=!1,o._show=!0,ll(!1));let p=o.side,S=p%2,{min:b,max:T}=h,[V,k]=Rr(a,b,T,S==0?G:j);if(k==0)return;let z=h.distr==2,q=o._splits=o.splits(s,a,b,T,V,k,z),me=h.distr==2?q.map(se=>lt[se]):q,K=h.distr==2?lt[q[1]]-lt[q[0]]:V,ae=o._values=o.values(s,o.filter(s,me,a,k,K),a,k,K);o._rotate=p==2?o.rotate(s,ae,a,k):0;let J=o._size;o._size=Kn(o.size(s,ae,a,l)),J!=null&&o._size!=J&&(i=!1)}),i}function Vr(l){let i=!0;return as.forEach((o,a)=>{let h=o(s,a,bt,l);h!=mt[a]&&(i=!1),mt[a]=h}),i}function Fr(){for(let l=0;llt[nt]):K,J=k.distr==2?lt[K[1]]-lt[K[0]]:T,se=i.ticks,ge=i.border,We=se.show?Me(se.size*te):0,ue=i._rotate*-Bl/180,Ve=N(i._pos*te),Be=(We+me)*b,Oe=Ve+Be;p=a==0?Oe:0,h=a==1?Oe:0;let Ue=i.font[0],wt=i.align==1?Yt:i.align==2?Pn:ue>0?Yt:ue<0?Pn:a==0?"center":o==3?Pn:Yt,St=ue||a==1?"middle":o==2?hl:Is;fs(Ue,S,wt,St);let Es=i.font[1]*ba,Nl=K.map(nt=>N(d(nt,k,z,q))),Ps=i._values;for(let nt=0;nt{o>0&&(i._paths=null,l&&(r==1?(i.min=null,i.max=null):i.facets.forEach(a=>{a.min=null,a.max=null})))})}let yn=!1;function xt(){yn||(Uo(Nr),yn=!0)}function Nr(){an&&(Er(),an=!1),Ft&&(yr(),Ft=!1),xl&&(ce(x,Yt,pe),ce(x,hl,_e),ce(x,pl,G),ce(x,ml,j),ce(M,Yt,pe),ce(M,hl,_e),ce(M,pl,G),ce(M,ml,j),ce(w,pl,Ne),ce(w,ml,qe),y.width=Me(Ne*te),y.height=Me(qe*te),C.forEach(({_el:l,_show:i,_size:o,_pos:a,side:h})=>{if(l!=null)if(i){let p=h===3||h===0?o:0,S=h%2==1;ce(l,S?"left":"top",a-p),ce(l,S?"width":"height",o),ce(l,S?"top":"left",S?_e:pe),ce(l,S?"height":"width",S?j:G),Hn(l,Tt)}else $e(l,Tt)}),Cl=Nt=fn=dn=pn=mn=gn=wn=hn=null,tl=1,Vl(!0),Pe("setSize"),xl=!1),Ne>0&&qe>0&&(u.clearRect(0,0,y.width,y.height),Pe("drawClear"),Y.forEach(l=>l()),Pe("draw")),B.show&&Xt&&(gt(null,!0,!1),Xt=!1),g||(g=!0,s.status=1,Pe("ready")),Dl=!1,yn=!1}s.redraw=(l,i)=>{Ft=i||!1,l!==!1?Ot(A,P.min,P.max):xt()};function bn(l,i){let o=D[l];if(o.from==null){if(be==0){let a=o.range(s,i.min,i.max,l);i.min=a[0],i.max=a[1]}if(i.min>i.max){let a=i.min;i.min=i.max,i.max=a}if(be>1&&i.min!=null&&i.max!=null&&i.max-i.min<1e-16)return;l==A&&o.distr==2&&be>0&&(i.min=vt(i.min,t[0]),i.max=vt(i.max,t[0]),i.min==i.max&&i.max++),F[l]=i,an=!0,xt()}}s.setScale=bn;let xn,kn,Al,Ll,ms,gs,nl,sl,ws,Ss,fe,he,kt=!1,ze=B.drag,xe=ze.x,ke=ze.y;B.show&&(B.x&&(xn=et(mo,M)),B.y&&(kn=et(go,M)),P.ori==0?(Al=xn,Ll=kn):(Al=kn,Ll=xn),fe=B.left,he=B.top);let Xe=s.select=we({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),il=Xe.show?et(po,Xe.over?M:x):null;function Rl(l,i){if(Xe.show){for(let o in l)ce(il,o,Xe[o]=l[o]);i!==!1&&Pe("setSelect")}}s.setSelect=Rl;function Or(l,i){let o=v[l],a=De?st[l]:null;o.show?a&&Hn(a,Tt):(a&&$e(a,Tt),Ie.length>1&&Gt(Ie[l],-10,-10,G,j))}function Ot(l,i,o){bn(l,{min:i,max:o})}function rt(l,i,o,a){i.focus!=null&&Yr(l),i.show!=null&&v.forEach((h,p)=>{p>0&&(l==p||l==null)&&(h.show=i.show,Or(p,i.show),Ot(r==2?h.facets[1].scale:h.scale,null,null),xt())}),o!==!1&&Pe("setSeries",l,i),a&&cl("setSeries",s,l,i)}s.setSeries=rt;function Hr(l,i){we(R[l],i)}function Ir(l,i){l.fill=ee(l.fill||null),l.dir=le(l.dir,-1),i=i??R.length,R.splice(i,0,l)}function Wr(l){l==null?R.length=0:R.splice(l,1)}s.addBand=Ir,s.setBand=Hr,s.delBand=Wr;function Br(l,i){v[l].alpha=i,B.show&&Ie[l]&&(Ie[l].style.opacity=i),De&&st[l]&&(st[l].style.opacity=i)}let rl,zl,ol,Ht={focus:!0};function Yr(l){if(l!=ol){let i=l==null,o=kl.alpha!=1;v.forEach((a,h)=>{let p=i||h==0||h==l;a._focus=i?null:p,o&&Br(h,p?1:kl.alpha)}),ol=l,o&&xt()}}De&&Ml&&Ct(qs,Je,l=>{B._lock||ol!=null&&rt(null,Ht,!0,Ae.setSeries)});function at(l,i,o){let a=D[i];o&&(l=l/te-(a.ori==1?_e:pe));let h=G;a.ori==1&&(h=j,l=h-l),a.dir==-1&&(l=h-l);let p=a._min,S=a._max,b=l/h,T=p+(S-p)*b,V=a.distr;return V==3?_t(10,T):V==4?Fo(T,a.asinh):T}function Gr(l,i){let o=at(l,A,i);return vt(o,t[0],Ce,Ee)}s.valToIdx=l=>vt(l,t[0]),s.posToIdx=Gr,s.posToVal=at,s.valToPos=(l,i,o)=>D[i].ori==0?c(l,D[i],o?tt:G,o?ye:0):m(l,D[i],o?yt:j,o?He:0);function qr(l){l(s),xt()}s.batch=qr,s.setCursor=(l,i,o)=>{fe=l.left,he=l.top,gt(null,i,o)};function vs(l,i){ce(il,Yt,Xe.left=l),ce(il,pl,Xe.width=i)}function _s(l,i){ce(il,hl,Xe.top=l),ce(il,ml,Xe.height=i)}let al=P.ori==0?vs:_s,ul=P.ori==1?vs:_s;function Ur(){if(De&&I.live)for(let l=r==2?1:0;l{(h>0||!Ze)&&bs(h,o)})}De&&I.live&&Ur(),it=!1,i!==!1&&Pe("setLegend")}s.setLegend=ys;function bs(l,i){let o;if(i==null)o=ot;else{let a=v[l],h=l==0&&U==2?lt:t[l];o=Ze?a.values(s,l,i):{_:a.value(s,h[i],l,i)}}I.values[l]=o}function gt(l,i,o){ws=fe,Ss=he,[fe,he]=B.move(s,fe,he),B.show&&(Al&&Gt(Al,Me(fe),0,G,j),Ll&&Gt(Ll,0,Me(he),G,j));let a,h=Ce>Ee;rl=Q;let p=P.ori==0?G:j,S=P.ori==1?G:j;if(fe<0||be==0||h){a=null;for(let b=0;b0&&Ie.length>1&&Gt(Ie[b],-10,-10,G,j);if(Ml&&rt(null,Ht,!0,l==null&&Ae.setSeries),I.live){H.fill(null),it=!0;for(let b=0;b0&&z.show){let se=ae==null?-10:Pt(Z(ae,r==1?D[z.scale]:D[z.facets[1].scale],S,0),.5);if(se>0&&r==1){let ue=Ye(se-he);ue<=rl&&(rl=ue,zl=k)}let ge,We;if(P.ori==0?(ge=J,We=se):(ge=se,We=J),it&&Ie.length>1){Co(Ie[k],B.points.fill(s,k),B.points.stroke(s,k));let ue,Ve,Be,Oe,Ue=!0,wt=B.points.bbox;if(wt!=null){Ue=!1;let St=wt(s,k);Be=St.left,Oe=St.top,ue=St.width,Ve=St.height}else Be=ge,Oe=We,ue=Ve=B.points.size(s,k);Eo(Ie[k],ue,Ve,Ue),Gt(Ie[k],Be,Oe,G,j)}}if(I.live){if(!it||k==0&&Ze)continue;bs(k,K)}}}if(B.idx=a,B.left=fe,B.top=he,it&&(I.idx=a,ys()),Xe.show&&kt)if(l!=null){let[b,T]=Ae.scales,[V,k]=Ae.match,[z,q]=l.cursor.sync.scales,me=l.cursor.drag;if(xe=me._x,ke=me._y,xe||ke){let{left:K,top:ae,width:J,height:se}=l.select,ge=l.scales[b].ori,We=l.posToVal,ue,Ve,Be,Oe,Ue,wt=b!=null&&V(b,z),St=T!=null&&k(T,q);wt&&xe?(ge==0?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[b],Oe=re(We(ue,z),Be,p,0),Ue=re(We(ue+Ve,z),Be,p,0),al(Ge(Oe,Ue),Ye(Ue-Oe))):al(0,p),St&&ke?(ge==1?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[T],Oe=Z(We(ue,q),Be,S,0),Ue=Z(We(ue+Ve,q),Be,S,0),ul(Ge(Oe,Ue),Ye(Ue-Oe))):ul(0,S)}else Tn()}else{let b=Ye(ws-ms),T=Ye(Ss-gs);if(P.ori==1){let q=b;b=T,T=q}xe=ze.x&&b>=ze.dist,ke=ze.y&&T>=ze.dist;let V=ze.uni;V!=null?xe&&ke&&(xe=b>=V,ke=T>=V,!xe&&!ke&&(T>b?ke=!0:xe=!0)):ze.x&&ze.y&&(xe||ke)&&(xe=ke=!0);let k,z;xe&&(P.ori==0?(k=nl,z=fe):(k=sl,z=he),al(Ge(k,z),Ye(z-k)),ke||ul(0,S)),ke&&(P.ori==1?(k=nl,z=fe):(k=sl,z=he),ul(Ge(k,z),Ye(z-k)),xe||al(0,p)),!xe&&!ke&&(al(0,0),ul(0,0))}if(ze._x=xe,ze._y=ke,l==null){if(o){if(Cs!=null){let[b,T]=Ae.scales;Ae.values[0]=b!=null?at(P.ori==0?fe:he,b):null,Ae.values[1]=T!=null?at(P.ori==1?fe:he,T):null}cl(Bs,s,fe,he,G,j,a)}if(Ml){let b=o&&Ae.setSeries,T=kl.prox;ol==null?rl<=T&&rt(zl,Ht,!0,b):rl>T?rt(null,Ht,!0,b):zl!=ol&&rt(zl,Ht,!0,b)}}g&&i!==!1&&Pe("setCursor")}let It=null;function Vl(l){l===!0?It=null:(It=M.getBoundingClientRect(),Pe("syncRect",It))}function xs(l,i,o,a,h,p,S){B._lock||(Mn(l,i,o,a,h,p,S,!1,l!=null),l!=null?gt(null,!0,!0):gt(i,!0,!1))}function Mn(l,i,o,a,h,p,S,b,T){if(It==null&&Vl(!1),l!=null)o=l.clientX-It.left,a=l.clientY-It.top;else{if(o<0||a<0){fe=-10,he=-10;return}let[V,k]=Ae.scales,z=i.cursor.sync,[q,me]=z.values,[K,ae]=z.scales,[J,se]=Ae.match,ge=i.axes[0].side%2==1,We=P.ori==0?G:j,ue=P.ori==1?G:j,Ve=ge?p:h,Be=ge?h:p,Oe=ge?a:o,Ue=ge?o:a;if(K!=null?o=J(V,K)?d(q,D[V],We,0):-10:o=We*(Oe/Ve),ae!=null?a=se(k,ae)?d(me,D[k],ue,0):-10:a=ue*(Ue/Be),P.ori==1){let wt=o;o=a,a=wt}}T&&((o<=1||o>=G-1)&&(o=Mt(o,G)),(a<=1||a>=j-1)&&(a=Mt(a,j))),b?(ms=o,gs=a,[nl,sl]=B.move(s,o,a)):(fe=o,he=a)}let $r={width:0,height:0};function Tn(){Rl($r,!1)}function ks(l,i,o,a,h,p,S){kt=!0,xe=ke=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!0,!1),l!=null&&(Qe(An,Nn,Ms),cl(Ys,s,nl,sl,G,j,null))}function Ms(l,i,o,a,h,p,S){kt=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!1,!0);let{left:b,top:T,width:V,height:k}=Xe,z=V>0||k>0;if(z&&Rl(Xe),ze.setScale&&z){let q=b,me=V,K=T,ae=k;if(P.ori==1&&(q=T,me=k,K=b,ae=V),xe&&Ot(A,at(q,A),at(q+me,A)),ke)for(let J in D){let se=D[J];J!=A&&se.from==null&&se.min!=Q&&Ot(J,at(K+ae,J),at(K,J))}Tn()}else B.lock&&(B._lock=!B._lock,B._lock||gt(null,!0,!1));l!=null&&(ne(An,Nn),cl(An,s,fe,he,G,j,null))}function Kr(l,i,o,a,h,p,S){if(!B._lock){let b=kt;if(kt){let T=!0,V=!0,k=10,z,q;P.ori==0?(z=xe,q=ke):(z=ke,q=xe),z&&q&&(T=fe<=k||fe>=G-k,V=he<=k||he>=j-k),z&&T&&(fe=fe{rt(o,a,!0,!1)},B.show&&(Qe(Ys,M,ks),Qe(Bs,M,xs),Qe(Gs,M,Vl),Qe(qs,M,Kr),Qe(Us,M,Ts),Bn.add(s),s.syncRect=Vl);let Fl=s.hooks=e.hooks||{};function Pe(l,i,o){l in Fl&&Fl[l].forEach(a=>{a.call(null,s,i,o)})}(e.plugins||[]).forEach(l=>{for(let i in l.hooks)Fl[i]=(Fl[i]||[]).concat(l.hooks[i])});let Ae=we({key:null,setSeries:!1,filters:{pub:li,sub:li},scales:[A,v[1]?v[1].scale:null],match:[ni,ni],values:[null,null]},B.sync);B.sync=Ae;let Cs=Ae.key,Dn=Yi(Cs);function cl(l,i,o,a,h,p,S){Ae.filters.pub(l,i,o,a,h,p,S)&&Dn.pub(l,i,o,a,h,p,S)}Dn.sub(s);function jr(l,i,o,a,h,p,S){Ae.filters.sub(l,i,o,a,h,p,S)&&Wt[l](null,i,o,a,h,p,S)}s.pub=jr;function Jr(){Dn.unsub(s),Bn.delete(s),pt.clear(),In(Yl,Ut,Ds),_.remove(),Pe("destroy")}s.destroy=Jr;function Cn(){Pe("init",e,t),us(t||e.data,!1),F[A]?bn(A,F[A]):cn(),un(e.width,e.height),gt(null,!0,!1),Rl(Xe,!1)}return v.forEach(os),C.forEach(Cr),n?n instanceof HTMLElement?(n.appendChild(_),Cn()):n(s,Cn):Cn(),s}Se.assign=we;Se.fmtNum=$n;Se.rangeNum=Gl;Se.rangeLog=$l;Se.rangeAsinh=qn;Se.orient=Rt;Se.pxRatio=te;Se.join=qo;Se.fmtDate=jn,Se.tzDate=Xo;Se.sync=Yi;{Se.addGap=Ha,Se.clipGaps=Zl;let e=Se.paths={points:ji};e.linear=Zi,e.stepped=Ba,e.bars=Ya,e.spline=qa}var lu=(e,t,n)=>su(e-t,n)+t,nu=(e,t)=>e-t;function su(e,t){return Math.floor(e/t)*t}function iu(e,t){let n=[...e.values()];t&&n.sort((f,c)=>t(f.value,c.value));let s=Array(n.length),r=Array(n.length);for(let f=0;f+e,tn=class{constructor(t,n){this.chart=t,this.datasets=new Map,this.options=n,this.bucketSize=lr(n),this.histOffset=0}handleMeasurements(t){t.forEach(({y:n})=>{if(n==null)return;n=lu(n,this.histOffset,this.bucketSize);let s=this.datasets.get(n);s?s.count++:this.datasets.set(n,{value:n,count:1})}),this.chart.setData(iu(this.datasets,nu))}static initialData(){return[[],[]]}static getConfig(t){let n=lr(t),s=Se.paths.bars({align:1,size:[1,1/0],gap:4});return{title:t.title,width:t.width,height:t.height,scales:{x:{time:!1,auto:!1,dir:1,range:r=>[r.data[0][0],r.data[0][r.data[0].length-1]+n]}},axes:[{incrs:()=>[0,1,2,3,4,5,6,7,8,9,10].map(r=>r*n),splits:(r,f,c,m,d,g)=>{let _=r.axes[f]._space,y=r.valToPos(r.data[0][0]+n,"x")-r.valToPos(r.data[0][0],"x"),u=r.data[0][0],w=r.data[0][r.data[0].length-1]+n,x=[],M=Math.ceil(_/y);for(let L=0,N=u;N<=w;L++,N+=n)!(L%M)&&x.push(N);return x}}],series:[{label:t.label,value:(r,f)=>f+`-${f+n} ${t.unit}`},{paths:s,points:{show:!1},...Ol.at(1),width:2,label:"Events"}]}}};var ru=e=>e.unit?{value:(t,n)=>n==null?"--":n.toFixed(3)+` ${e.unit}`}:{},sr=e=>({value:"{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}"}),ou=e=>e.unit?{values:(t,n,s)=>n.map(r=>+r.toFixed(2)+` ${e.unit}`)}:{},ir=e=>({space:55,values:[[3600*24*365,"{YYYY}",null,null,null,null,null,null,1],[3600*24*28,"{MMM}",` +(()=>{var Zr=Object.create;var Rs=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var Xr=Object.getOwnPropertyNames;var eo=Object.getPrototypeOf,to=Object.prototype.hasOwnProperty;var lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var no=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Xr(t))!to.call(e,r)&&r!==n&&Rs(e,r,{get:()=>t[r],enumerable:!(s=Qr(t,r))||s.enumerable});return e};var so=(e,t,n)=>(n=e!=null?Zr(eo(e)):{},no(t||!e||!e.__esModule?Rs(n,"default",{value:e,enumerable:!0}):n,e));var Vs=lo((En,zs)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof En=="object"?zs.exports=t():e.NProgress=t()})(En,function(){var e={};e.version="0.2.0";var t=e.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};e.configure=function(u){var w,k;for(w in u)k=u[w],k!==void 0&&u.hasOwnProperty(w)&&(t[w]=k);return this},e.status=null,e.set=function(u){var w=e.isStarted();u=n(u,t.minimum,1),e.status=u===1?null:u;var k=e.render(!w),M=k.querySelector(t.barSelector),L=t.speed,N=t.easing;return k.offsetWidth,f(function(E){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),c(M,r(u,L,N)),u===1?(c(k,{transition:"none",opacity:1}),k.offsetWidth,setTimeout(function(){c(k,{transition:"all "+L+"ms linear",opacity:0}),setTimeout(function(){e.remove(),E()},L)},L)):setTimeout(E,L)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var u=function(){setTimeout(function(){!e.status||(e.trickle(),u())},t.trickleSpeed)};return t.trickle&&u(),this},e.done=function(u){return!u&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(u){var w=e.status;return w?(typeof u!="number"&&(u=(1-w)*n(Math.random()*w,.1,.95)),w=n(w+u,0,.994),e.set(w)):e.start()},e.trickle=function(){return e.inc(Math.random()*t.trickleRate)},function(){var u=0,w=0;e.promise=function(k){return!k||k.state()==="resolved"?this:(w===0&&e.start(),u++,w++,k.always(function(){w--,w===0?(u=0,e.done()):e.set((u-w)/u)}),this)}}(),e.render=function(u){if(e.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");var w=document.createElement("div");w.id="nprogress",w.innerHTML=t.template;var k=w.querySelector(t.barSelector),M=u?"-100":s(e.status||0),L=document.querySelector(t.parent),N;return c(k,{transition:"all 0 linear",transform:"translate3d("+M+"%,0,0)"}),t.showSpinner||(N=w.querySelector(t.spinnerSelector),N&&y(N)),L!=document.body&&d(L,"nprogress-custom-parent"),L.appendChild(w),w},e.remove=function(){g(document.documentElement,"nprogress-busy"),g(document.querySelector(t.parent),"nprogress-custom-parent");var u=document.getElementById("nprogress");u&&y(u)},e.isRendered=function(){return!!document.getElementById("nprogress")},e.getPositioningCSS=function(){var u=document.body.style,w="WebkitTransform"in u?"Webkit":"MozTransform"in u?"Moz":"msTransform"in u?"ms":"OTransform"in u?"O":"";return w+"Perspective"in u?"translate3d":w+"Transform"in u?"translate":"margin"};function n(u,w,k){return uk?k:u}function s(u){return(-1+u)*100}function r(u,w,k){var M;return t.positionUsing==="translate3d"?M={transform:"translate3d("+s(u)+"%,0,0)"}:t.positionUsing==="translate"?M={transform:"translate("+s(u)+"%,0)"}:M={"margin-left":s(u)+"%"},M.transition="all "+w+"ms "+k,M}var f=function(){var u=[];function w(){var k=u.shift();k&&k(w)}return function(k){u.push(k),u.length==1&&w()}}(),c=function(){var u=["Webkit","O","Moz","ms"],w={};function k(E){return E.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(v,C){return C.toUpperCase()})}function M(E){var v=document.body.style;if(E in v)return E;for(var C=u.length,D=E.charAt(0).toUpperCase()+E.slice(1),R;C--;)if(R=u[C]+D,R in v)return R;return E}function L(E){return E=k(E),w[E]||(w[E]=M(E))}function N(E,v,C){v=L(v),E.style[v]=C}return function(E,v){var C=arguments,D,R;if(C.length==2)for(D in v)R=v[D],R!==void 0&&v.hasOwnProperty(D)&&N(E,D,R);else N(E,C[1],C[2])}}();function m(u,w){var k=typeof u=="string"?u:_(u);return k.indexOf(" "+w+" ")>=0}function d(u,w){var k=_(u),M=k+w;m(k,w)||(u.className=M.substring(1))}function g(u,w){var k=_(u),M;!m(u,w)||(M=k.replace(" "+w+" "," "),u.className=M.substring(1,M.length-1))}function _(u){return(" "+(u.className||"")+" ").replace(/\s+/gi," ")}function y(u){u&&u.parentNode&&u.parentNode.removeChild(u)}return e})});var ss=so(Vs());var Ns={phoenix:[242,110,64],elixir:[75,68,115],red:[255,99,132],orange:[255,159,64],yellow:[255,205,86],green:[75,192,192],blue:[54,162,253],purple:[153,102,255],grey:[201,203,207]},Fs=Object.keys(Ns),Os={at:e=>{let[t,n,s]=Os.rgb(e);return`rgb(${t}, ${n}, ${s})`},rgb:e=>Ns[Fs[e%Fs.length]]},Ol={at:e=>{let[t,n,s]=Os.rgb(e);return{stroke:`rgb(${t}, ${n}, ${s})`,fill:`rgb(${t}, ${n}, ${s}, 0.1)`}}};var ve="u-",io="uplot",ro=ve+"hz",oo=ve+"vt",ao=ve+"title",uo=ve+"wrap",co=ve+"under",fo=ve+"over",ho=ve+"axis",Tt=ve+"off",po=ve+"select",mo=ve+"cursor-x",go=ve+"cursor-y",wo=ve+"cursor-pt",So=ve+"legend",vo=ve+"live",_o=ve+"inline",yo=ve+"thead",bo=ve+"series",ko=ve+"marker",Hs=ve+"label",xo=ve+"value",pl="width",ml="height",hl="top",Is="bottom",Yt="left",Pn="right",Yn="#000",Ws=Yn+"0",Bs="mousemove",Ys="mousedown",An="mouseup",Gs="mouseenter",qs="mouseleave",Us="dblclick",Mo="resize",To="scroll",$s="change",Yl="dppxchange",jt=typeof window<"u",Nn=jt?document:null,Ut=jt?window:null,Do=jt?navigator:null,te,Hl;function On(){let e=devicePixelRatio;te!=e&&(te=e,Hl&&In($s,Hl,On),Hl=matchMedia(`(min-resolution: ${te-.001}dppx) and (max-resolution: ${te+.001}dppx)`),Ct($s,Hl,On),Ut.dispatchEvent(new CustomEvent(Yl)))}function $e(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Hn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function ce(e,t,n){e.style[t]=n+"px"}function ct(e,t,n,s){let r=Nn.createElement(e);return t!=null&&$e(r,t),n?.insertBefore(r,s),r}function et(e,t){return ct("div",e,t)}var Ks=new WeakMap;function Gt(e,t,n,s,r){let f="translate("+t+"px,"+n+"px)",c=Ks.get(e);f!=c&&(e.style.transform=f,Ks.set(e,f),t<0||n<0||t>s||n>r?$e(e,Tt):Hn(e,Tt))}var js=new WeakMap;function Co(e,t,n){let s=t+n,r=js.get(e);s!=r&&(js.set(e,s),e.style.background=t,e.style.borderColor=n)}var Js=new WeakMap;function Eo(e,t,n,s){let r=t+""+n,f=Js.get(e);r!=f&&(Js.set(e,r),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=s?-t/2+"px":0,e.style.marginTop=s?-n/2+"px":0)}var Gn={passive:!0},ki={...Gn,capture:!0};function Ct(e,t,n,s){t.addEventListener(e,n,s?ki:Gn)}function In(e,t,n,s){t.removeEventListener(e,n,s?ki:Gn)}jt&&On();function vt(e,t,n,s){let r;n=n||0,s=s||t.length-1;let f=s<=2147483647;for(;s-n>1;)r=f?n+s>>1:Ke((n+s)/2),t[r]=t&&r<=n;r+=s)if(e[r]!=null)return r;return-1}function Po(e,t,n,s){let r=Q,f=-Q;if(s==1)r=e[t],f=e[n];else if(s==-1)r=e[n],f=e[t];else for(let c=t;c<=n;c++)e[c]!=null&&(r=Ge(r,e[c]),f=Le(f,e[c]));return[r,f]}function Ao(e,t,n){let s=Q,r=-Q;for(let f=t;f<=n;f++)e[f]>0&&(s=Ge(s,e[f]),r=Le(r,e[f]));return[s==Q?1:s,r==-Q?10:r]}var Ln=[0,0];function Zs(e,t,n,s){return Ln[0]=n<0?oe(e,-n):e,Ln[1]=s<0?oe(t,-s):t,Ln}function $l(e,t,n,s){let r=Vo(e),f=n==10?Et:xi;e==t&&(r==-1?(e*=n,t/=n):(e/=n,t*=n));let c,m,d;return s?(c=Ke(f(e)),m=Kn(f(t)),d=Zs(_t(n,c),_t(n,m),c,m),e=d[0],t=d[1]):(c=Ke(f(Ye(e))),m=Ke(f(Ye(t))),d=Zs(_t(n,c),_t(n,m),c,m),e=Ti(e,d[0]),t=Pt(t,d[1])),[e,t]}function qn(e,t,n,s){let r=$l(e,t,n,s);return e==0&&(r[0]=0),t==0&&(r[1]=0),r}var Un=.1,Qs={mode:3,pad:Un},wl={pad:0,soft:null,mode:0},Lo={min:wl,max:wl};function Gl(e,t,n,s){return jl(n)?Xs(e,t,n):(wl.pad=n,wl.soft=s?0:null,wl.mode=s?3:0,Xs(e,t,Lo))}function le(e,t){return e??t}function Ro(e,t,n){for(t=le(t,0),n=le(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function Xs(e,t,n){let s=n.min,r=n.max,f=le(s.pad,0),c=le(r.pad,0),m=le(s.hard,-Q),d=le(r.hard,Q),g=le(s.soft,Q),_=le(r.soft,-Q),y=le(s.mode,0),u=le(r.mode,0),w=t-e;w<1e-9&&(w=0,(e==0||t==0)&&(w=1e-9,y==2&&g!=Q&&(f=0),u==2&&_!=-Q&&(c=0)));let k=w||Ye(t)||1e3,M=Et(k),L=_t(10,Ke(M)),N=k*(w==0?e==0?.1:1:f),E=oe(Ti(e-N,L/10),9),v=e>=g&&(y==1||y==3&&E<=g||y==2&&E>=g)?g:Q,C=Le(m,E=v?v:Ge(v,E)),D=k*(w==0?t==0?.1:1:c),R=oe(Pt(t+D,L/10),9),A=t<=_&&(u==1||u==3&&R>=_||u==2&&R<=_)?_:-Q,W=Ge(d,R>A&&t<=A?A:Le(A,R));return C==W&&C==0&&(W=100),[C,W]}var zo=new Intl.NumberFormat(jt?Do.language:"en-US"),$n=e=>zo.format(e),je=Math,Bl=je.PI,Ye=je.abs,Ke=je.floor,Me=je.round,Kn=je.ceil,Ge=je.min,Le=je.max,_t=je.pow,Vo=je.sign,Et=je.log10,xi=je.log2,Fo=(e,t=1)=>je.sinh(e)*t,Rn=(e,t=1)=>je.asinh(e/t),Q=1/0;function ei(e){return(Et((e^e>>31)-(e>>31))|0)+1}function Mt(e,t){return Me(e/t)*t}function ti(e,t,n){return Ge(Le(e,t),n)}function ee(e){return typeof e=="function"?e:()=>e}var No=e=>e,Mi=(e,t)=>t,Oo=e=>null,li=e=>!0,ni=(e,t)=>e==t;function Pt(e,t){return Kn(e/t)*t}function Ti(e,t){return Ke(e/t)*t}function oe(e,t){return Me(e*(t=10**t))/t}var Kl=new Map;function Ho(e){return((""+e).split(".")[1]||"").length}function vl(e,t,n,s){let r=[],f=s.map(Ho);for(let c=t;c=0&&c>=0?0:m)+(c>=f[g]?0:f[g]),u=oe(_,y);r.push(u),Kl.set(u,y)}}return r}var Sl={},Di=[],Kt=[null,null],Dt=Array.isArray;function si(e){return typeof e=="string"}function jl(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function ii(e){return e!=null&&typeof e=="object"}var Io=Object.getPrototypeOf(Uint8Array);function At(e,t=jl){let n;if(Dt(e)){let s=e.find(r=>r!=null);if(Dt(s)||t(s)){n=Array(e.length);for(let r=0;rf){for(r=c-1;r>=0&&e[r]==null;)e[r--]=null;for(r=c+1;rc-m)],r=s[0].length,f=new Map;for(let c=0;c"u"?e=>Promise.resolve().then(e):queueMicrotask,Ci=["January","February","March","April","May","June","July","August","September","October","November","December"],Ei=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function Pi(e){return e.slice(0,3)}var $o=Ei.map(Pi),Ko=Ci.map(Pi),jo={MMMM:Ci,MMM:Ko,WWWW:Ei,WWW:$o};function dl(e){return(e<10?"0":"")+e}function Jo(e){return(e<10?"00":e<100?"0":"")+e}var Zo={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>dl(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>dl(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>dl(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?"PM":"AM",aa:e=>e.getHours()>=12?"pm":"am",a:e=>e.getHours()>=12?"p":"a",mm:e=>dl(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>dl(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>Jo(e.getMilliseconds())};function jn(e,t){t=t||jo;let n=[],s=/\{([a-z]+)\}|[^{]+/gi,r;for(;r=s.exec(e);)n.push(r[0][0]=="{"?Zo[r[1]]:r[0]);return f=>{let c="";for(let m=0;me%1==0,ql=[1,2,2.5,5],ea=vl(10,-16,0,ql),Li=vl(10,0,16,ql),ta=Li.filter(Ai),la=ea.concat(Li),Jn=` +`,Ri="{YYYY}",ri=Jn+Ri,zi="{M}/{D}",gl=Jn+zi,Il=gl+"/{YY}",Vi="{aa}",na="{h}:{mm}",qt=na+Vi,oi=Jn+qt,ai=":{ss}",ie=null;function Fi(e){let t=e*1e3,n=t*60,s=n*60,r=s*24,f=r*30,c=r*365,d=(e==1?vl(10,0,3,ql).filter(Ai):vl(10,-3,0,ql)).concat([t,t*5,t*10,t*15,t*30,n,n*5,n*10,n*15,n*30,s,s*2,s*3,s*4,s*6,s*8,s*12,r,r*2,r*3,r*4,r*5,r*6,r*7,r*8,r*9,r*10,r*15,f,f*2,f*3,f*4,f*6,c,c*2,c*5,c*10,c*25,c*50,c*100]),g=[[c,Ri,ie,ie,ie,ie,ie,ie,1],[r*28,"{MMM}",ri,ie,ie,ie,ie,ie,1],[r,zi,ri,ie,ie,ie,ie,ie,1],[s,"{h}"+Vi,Il,ie,gl,ie,ie,ie,1],[n,qt,Il,ie,gl,ie,ie,ie,1],[t,ai,Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1],[e,ai+".{fff}",Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1]];function _(y){return(u,w,k,M,L,N)=>{let E=[],v=L>=c,C=L>=f&&L=r?r:L,$=Ke(k)-Ke(R),P=W+$+Pt(R-W,Y);E.push(P);let U=y(P),re=U.getHours()+U.getMinutes()/n+U.getSeconds()/s,Z=L/s,F=u.axes[w]._space,X=N/F;for(;P=oe(P+L,e==1?0:3),!(P>M);)if(Z>1){let O=Ke(oe(re+Z,6))%24,Fe=y(P).getHours()-O;Fe>1&&(Fe=-1),P-=Fe*s,re=(re+Z)%24;let H=E[E.length-1];oe((P-H)/L,3)*X>=.7&&E.push(P)}else E.push(P)}return E}}return[d,g,_]}var[sa,ia,ra]=Fi(1),[oa,aa,ua]=Fi(.001);vl(2,-53,53,[1]);function ui(e,t){return e.map(n=>n.map((s,r)=>r==0||r==8||s==null?s:t(r==1||n[8]==0?s:n[1]+s)))}function ci(e,t){return(n,s,r,f,c)=>{let m=t.find(k=>c>=k[0])||t[t.length-1],d,g,_,y,u,w;return s.map(k=>{let M=e(k),L=M.getFullYear(),N=M.getMonth(),E=M.getDate(),v=M.getHours(),C=M.getMinutes(),D=M.getSeconds(),R=L!=d&&m[2]||N!=g&&m[3]||E!=_&&m[4]||v!=y&&m[5]||C!=u&&m[6]||D!=w&&m[7]||m[1];return d=L,g=N,_=E,y=v,u=C,w=D,R(M)})}}function ca(e,t){let n=jn(t);return(s,r,f,c,m)=>r.map(d=>n(e(d)))}function zn(e,t,n){return new Date(e,t,n)}function fi(e,t){return t(e)}var fa="{YYYY}-{MM}-{DD} {h}:{mm}{aa}";function hi(e,t){return(n,s)=>t(e(s))}function ha(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null}function da(e,t){return e.series[t].fill(e,t)}var pa={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:ha,fill:da,dash:"solid"},idx:null,idxs:null,values:[]};function ma(e,t){let n=e.cursor.points,s=et(),r=n.size(e,t);ce(s,pl,r),ce(s,ml,r);let f=r/-2;ce(s,"marginLeft",f),ce(s,"marginTop",f);let c=n.width(e,t,r);return c&&ce(s,"borderWidth",c),s}function ga(e,t){let n=e.series[t].points;return n._fill||n._stroke}function wa(e,t){let n=e.series[t].points;return n._stroke||n._fill}function Sa(e,t){let n=e.series[t].points;return Wi(n.width,1)}function va(e,t,n){return n}var Vn=[0,0];function _a(e,t,n){return Vn[0]=t,Vn[1]=n,Vn}function Wl(e,t,n){return s=>{s.button==0&&n(s)}}function Fn(e,t,n){return n}var ya={show:!0,x:!0,y:!0,lock:!1,move:_a,points:{show:ma,size:Sa,width:0,stroke:wa,fill:ga},bind:{mousedown:Wl,mouseup:Wl,click:Wl,dblclick:Wl,mousemove:Fn,mouseleave:Fn,mouseenter:Fn},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:va,idxs:null},Ni={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Zn=we({},Ni,{filter:Mi}),Oi=we({},Zn,{size:10}),Hi=we({},Ni,{show:!1}),Qn='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Ii="bold "+Qn,ba=1.5,di={show:!0,scale:"x",stroke:Yn,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:2,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0},ka="Value",xa="Time",pi={show:!0,scale:"x",auto:!1,sorted:1,min:Q,max:-Q,idxs:[]};function Ma(e,t,n,s,r){return t.map(f=>f==null?"":$n(f))}function Ta(e,t,n,s,r,f,c){let m=[],d=Kl.get(r)||0;n=c?n:oe(Pt(n,r),d);for(let g=n;g<=s;g=oe(g+r,d))m.push(Object.is(g,-0)?0:g);return m}function Wn(e,t,n,s,r,f,c){let m=[],d=e.scales[e.axes[t].scale].log,g=d==10?Et:xi,_=Ke(g(n));r=_t(d,_),_<0&&(r=oe(r,-_));let y=n;do m.push(y),y=oe(y+r,Kl.get(r)),y>=r*d&&(r=y);while(y<=s);return m}function Da(e,t,n,s,r,f,c){let d=e.scales[e.axes[t].scale].asinh,g=s>d?Wn(e,t,Le(d,n),s,r):[d],_=s>=0&&n<=0?[0]:[];return(n<-d?Wn(e,t,Le(d,-s),-n,r):[d]).reverse().map(u=>-u).concat(_,g)}var Ca=/./,Ea=/[12357]/,Pa=/[125]/,Aa=/1/;function La(e,t,n,s,r){let f=e.axes[n],c=f.scale,m=e.scales[c];if(m.distr==3&&m.log==2)return t;let d=e.valToPos,g=f._space,_=d(10,c),y=d(9,c)-_>=g?Ca:d(7,c)-_>=g?Ea:d(5,c)-_>=g?Pa:Aa;return t.map(u=>m.distr==4&&u==0||y.test(u)?u:null)}function Ra(e,t){return t==null?"":$n(t)}var mi={show:!0,scale:"y",stroke:Yn,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:3,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0};function Wi(e,t){let n=3+(e||1)*2;return oe(n*t,3)}function za(e,t){let{scale:n,idxs:s}=e.series[0],r=e._data[0],f=e.valToPos(r[s[0]],n,!0),c=e.valToPos(r[s[1]],n,!0),m=Ye(c-f),d=e.series[t],g=m/(d.points.space*te);return s[1]-s[0]<=g}var gi={scale:null,auto:!0,sorted:0,min:Q,max:-Q},Va={show:!0,auto:!0,sorted:0,alpha:1,facets:[we({},gi,{scale:"x"}),we({},gi,{scale:"y"})]},wi={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:(e,t,n,s,r)=>r,alpha:1,points:{show:za,filter:null},values:null,min:Q,max:-Q,idxs:[],path:null,clip:null};function Fa(e,t,n,s,r){return n/10}var Bi={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Na=we({},Bi,{time:!1,ori:1}),Si={};function Yi(e,t){let n=Si[e];return n||(n={key:e,plots:[],sub(s){n.plots.push(s)},unsub(s){n.plots=n.plots.filter(r=>r!=s)},pub(s,r,f,c,m,d,g){for(let _=0;_{let N=c.pxRound,E=g.dir*(g.ori==0?1:-1),v=g.ori==0?Jt:Zt,C,D;E==1?(C=n,D=s):(C=s,D=n);let R=N(y(m[C],g,M,w)),A=N(u(d[C],_,L,k)),W=N(y(m[D],g,M,w)),Y=N(u(f==1?_.max:_.min,_,L,k)),$=new Path2D(r);return v($,W,Y),v($,R,Y),v($,R,A),$})}function Zl(e,t,n,s,r,f){let c=null;if(e.length>0){c=new Path2D;let m=t==0?en:es,d=n;for(let _=0;_y[0]){let u=y[0]-d;u>0&&m(c,d,s,u,s+f),d=y[1]}}let g=n+r-d;g>0&&m(c,d,s,g,s+f)}return c}function Ha(e,t,n){let s=e[e.length-1];s&&s[0]==t?s[1]=n:e.push([t,n])}function Xn(e,t,n,s,r,f,c){let m=[];for(let d=r==1?n:s;d>=n&&d<=s;d+=r)if(t[d]===null){let _=d,y=d;if(r==1)for(;++d<=s&&t[d]===null;)y=d;else for(;--d>=n&&t[d]===null;)y=d;let u=f(e[_]),w=y==_?u:f(e[y]);u=c<=0?f(e[_-r]):u,w=c>=0?f(e[y+r]):w,w>=u&&m.push([u,w])}return m}function vi(e){return e==0?No:e==1?Me:t=>Mt(t,e)}function Gi(e){let t=e==0?Ql:Xl,n=e==0?(r,f,c,m,d,g)=>{r.arcTo(f,c,m,d,g)}:(r,f,c,m,d,g)=>{r.arcTo(c,f,d,m,g)},s=e==0?(r,f,c,m,d)=>{r.rect(f,c,m,d)}:(r,f,c,m,d)=>{r.rect(c,f,d,m)};return(r,f,c,m,d,g=0)=>{g==0?s(r,f,c,m,d):(g=Ge(g,m/2,d/2),t(r,f+g,c),n(r,f+m,c,f+m,c+d,g),n(r,f+m,c+d,f,c+d,g),n(r,f,c+d,f,c,g),n(r,f,c,f+m,c,g),r.closePath())}}var Ql=(e,t,n)=>{e.moveTo(t,n)},Xl=(e,t,n)=>{e.moveTo(n,t)},Jt=(e,t,n)=>{e.lineTo(t,n)},Zt=(e,t,n)=>{e.lineTo(n,t)},en=Gi(0),es=Gi(1),qi=(e,t,n,s,r,f)=>{e.arc(t,n,s,r,f)},Ui=(e,t,n,s,r,f)=>{e.arc(n,t,s,r,f)},$i=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(t,n,s,r,f,c)},Ki=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(n,t,r,s,c,f)};function ji(e){return(t,n,s,r,f)=>Rt(t,n,(c,m,d,g,_,y,u,w,k,M,L)=>{let{pxRound:N,points:E}=c,v,C;g.ori==0?(v=Ql,C=qi):(v=Xl,C=Ui);let D=oe(E.width*te,3),R=(E.size-E.width)/2*te,A=oe(R*2,3),W=new Path2D,Y=new Path2D,{left:$,top:P,width:U,height:re}=t.bbox;en(Y,$-A,P-A,U+A*2,re+A*2);let Z=F=>{if(d[F]!=null){let X=N(y(m[F],g,M,w)),O=N(u(d[F],_,L,k));v(W,X+R,O),C(W,X,O,R,0,Bl*2)}};if(f)f.forEach(Z);else for(let F=s;F<=r;F++)Z(F);return{stroke:D>0?W:null,fill:W,clip:Y,flags:Lt|Ul}})}function Ji(e){return(t,n,s,r,f,c)=>{s!=r&&(f!=s&&c!=s&&e(t,n,s),f!=r&&c!=r&&e(t,n,r),e(t,n,c))}}var Ia=Ji(Jt),Wa=Ji(Zt);function Zi(e){let t=le(e?.alignGaps,0);return(n,s,r,f)=>Rt(n,s,(c,m,d,g,_,y,u,w,k,M,L)=>{let N=c.pxRound,E=H=>N(y(H,g,M,w)),v=H=>N(u(H,_,L,k)),C,D;g.ori==0?(C=Jt,D=Ia):(C=Zt,D=Wa);let R=g.dir*(g.ori==0?1:-1),A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=Q,$=-Q,P,U,re,Z=E(m[R==1?r:f]),F=$t(d,r,f,1*R),X=$t(d,r,f,-1*R),O=E(m[F]),Re=E(m[X]);for(let H=R==1?r:f;H>=r&&H<=f;H+=R){let I=E(m[H]);I==Z?d[H]!=null&&(U=v(d[H]),Y==Q&&(C(W,I,U),P=U),Y=Ge(U,Y),$=Le(U,$)):(Y!=Q&&(D(W,Z,Y,$,P,U),re=Z),d[H]!=null?(U=v(d[H]),C(W,I,U),Y=$=P=U):(Y=Q,$=-Q),Z=I)}Y!=Q&&Y!=$&&re!=Z&&D(W,Z,Y,$,P,U);let[Te,Fe]=Jl(n,s);if(c.fill!=null||Te!=0){let H=A.fill=new Path2D(W),I=c.fillTo(n,s,c.min,c.max,Te),De=v(I);C(H,Re,De),C(H,O,De)}if(!c.spanGaps){let H=[];H.push(...Xn(m,d,r,f,R,E,t)),A.gaps=H=c.gaps(n,s,r,f,H),A.clip=Zl(H,g.ori,w,k,M,L)}return Fe!=0&&(A.band=Fe==2?[ft(n,s,r,f,W,-1),ft(n,s,r,f,W,1)]:ft(n,s,r,f,W,Fe)),A})}function Ba(e){let t=le(e.align,1),n=le(e.ascDesc,!1),s=le(e.alignGaps,0);return(r,f,c,m)=>Rt(r,f,(d,g,_,y,u,w,k,M,L,N,E)=>{let v=d.pxRound,C=F=>v(w(F,y,N,M)),D=F=>v(k(F,u,E,L)),R=y.ori==0?Jt:Zt,A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=y.dir*(y.ori==0?1:-1);c=$t(_,c,m,1),m=$t(_,c,m,-1);let $=D(_[Y==1?c:m]),P=C(g[Y==1?c:m]),U=P;R(W,P,$);for(let F=Y==1?c:m;F>=c&&F<=m;F+=Y){let X=_[F];if(X==null)continue;let O=C(g[F]),Re=D(X);t==1?R(W,O,$):R(W,U,Re),R(W,O,Re),$=Re,U=O}let[re,Z]=Jl(r,f);if(d.fill!=null||re!=0){let F=A.fill=new Path2D(W),X=d.fillTo(r,f,d.min,d.max,re),O=D(X);R(F,U,O),R(F,P,O)}if(!d.spanGaps){let F=[];F.push(...Xn(g,_,c,m,Y,C,s));let X=d.width*te/2,O=n||t==1?X:-X,Re=n||t==-1?-X:X;F.forEach(Te=>{Te[0]+=O,Te[1]+=Re}),A.gaps=F=d.gaps(r,f,c,m,F),A.clip=Zl(F,y.ori,M,L,N,E)}return Z!=0&&(A.band=Z==2?[ft(r,f,c,m,W,-1),ft(r,f,c,m,W,1)]:ft(r,f,c,m,W,Z)),A})}function Ya(e){e=e||Sl;let t=le(e.size,[.6,Q,1]),n=e.align||0,s=(e.gap||0)*te,r=le(e.radius,0),f=1-t[0],c=le(t[1],Q)*te,m=le(t[2],1)*te,d=le(e.disp,Sl),g=le(e.each,u=>{}),{fill:_,stroke:y}=d;return(u,w,k,M)=>Rt(u,w,(L,N,E,v,C,D,R,A,W,Y,$)=>{let P=L.pxRound,U=v.dir*(v.ori==0?1:-1),re=C.dir*(C.ori==1?1:-1),Z=v.ori==0?en:es,F=v.ori==0?g:(ne,Ne,qe,G,j,pe,_e)=>{g(ne,Ne,qe,j,G,_e,pe)},[X,O]=Jl(u,w),Re=C.distr==3?X==1?C.max:C.min:0,Te=R(Re,C,$,W),Fe,H,I=P(L.width*te),De=!1,de=null,Je=null,st=null,ht=null;_!=null&&(I==0||y!=null)&&(De=!0,de=_.values(u,w,k,M),Je=new Map,new Set(de).forEach(ne=>{ne!=null&&Je.set(ne,new Path2D)}),I>0&&(st=y.values(u,w,k,M),ht=new Map,new Set(st).forEach(ne=>{ne!=null&&ht.set(ne,new Path2D)})));let{x0:dt,size:Ze}=d;if(dt!=null&&Ze!=null){N=dt.values(u,w,k,M),dt.unit==2&&(N=N.map(Ne=>u.posToVal(A+Ne*Y,v.key,!0)));let ne=Ze.values(u,w,k,M);Ze.unit==2?H=ne[0]*Y:H=D(ne[0],v,Y,A)-D(0,v,Y,A),H=P(H-I),Fe=U==1?-I/2:H+I/2}else{let ne=Y;if(N.length>1){let qe=null;for(let G=0,j=1/0;G=k&&ne<=M;ne+=U){let Ne=E[ne];if(Ne===void 0)continue;let qe=v.distr!=2||d!=null?N[ne]:ne,G=D(qe,v,Y,A),j=R(le(Ne,Re),C,$,W);Qe!=null&&Ne!=null&&(Te=R(Qe[ne],C,$,W));let pe=P(G-Fe),_e=P(Le(j,Te)),ye=P(Ge(j,Te)),He=_e-ye,tt=r*H;Ne!=null&&(De?(I>0&&st[ne]!=null&&Z(ht.get(st[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt),de[ne]!=null&&Z(Je.get(de[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt)):Z(Vt,pe,ye+Ke(I/2),H,Le(0,He-I),tt),F(u,w,ne,pe-I/2,ye,H+I,He)),O!=0&&(re*O==1?(_e=ye,ye=Qt):(ye=_e,_e=Qt),He=_e-ye,Z(on,pe-I/2,ye,H+I,Le(0,He),0))}return I>0&&(ot.stroke=De?ht:Vt),ot.fill=De?Je:Vt,ot})}function Ga(e,t){let n=le(t?.alignGaps,0);return(s,r,f,c)=>Rt(s,r,(m,d,g,_,y,u,w,k,M,L,N)=>{let E=m.pxRound,v=O=>E(u(O,_,L,k)),C=O=>E(w(O,y,N,M)),D,R,A;_.ori==0?(D=Ql,A=Jt,R=$i):(D=Xl,A=Zt,R=Ki);let W=_.dir*(_.ori==0?1:-1);f=$t(g,f,c,1),c=$t(g,f,c,-1);let Y=v(d[W==1?f:c]),$=Y,P=[],U=[];for(let O=W==1?f:c;O>=f&&O<=c;O+=W)if(g[O]!=null){let Te=d[O],Fe=v(Te);P.push($=Fe),U.push(C(g[O]))}let re={stroke:e(P,U,D,A,R,E),fill:null,clip:null,band:null,gaps:null,flags:Lt},Z=re.stroke,[F,X]=Jl(s,r);if(m.fill!=null||F!=0){let O=re.fill=new Path2D(Z),Re=m.fillTo(s,r,m.min,m.max,F),Te=C(Re);A(O,$,Te),A(O,Y,Te)}if(!m.spanGaps){let O=[];O.push(...Xn(d,g,f,c,W,v,n)),re.gaps=O=m.gaps(s,r,f,c,O),re.clip=Zl(O,_.ori,k,M,L,N)}return X!=0&&(re.band=X==2?[ft(s,r,f,c,Z,-1),ft(s,r,f,c,Z,1)]:ft(s,r,f,c,Z,X)),re})}function qa(e){return Ga(Ua,e)}function Ua(e,t,n,s,r,f){let c=e.length;if(c<2)return null;let m=new Path2D;if(n(m,e[0],t[0]),c==2)s(m,e[1],t[1]);else{let d=Array(c),g=Array(c-1),_=Array(c-1),y=Array(c-1);for(let u=0;u0!=g[u]>0?d[u]=0:(d[u]=3*(y[u-1]+y[u])/((2*y[u]+y[u-1])/g[u-1]+(y[u]+2*y[u-1])/g[u]),isFinite(d[u])||(d[u]=0));d[c-1]=g[c-2];for(let u=0;u{e.syncRect(!0)})}jt&&(Ct(Mo,Ut,_i),Ct(To,Ut,_i,!0),Ct(Yl,Ut,()=>{Se.pxRatio=te}));var $a=Zi(),Ka=ji();function yi(e,t,n,s){return(s?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((f,c)=>Qi(f,c,t,n))}function ja(e,t){return e.map((n,s)=>s==0?null:we({},t,n))}function Qi(e,t,n,s){return we({},t==0?n:s,e)}function Xi(e,t,n){return t==null?Kt:[t,n]}var Ja=Xi;function Za(e,t,n){return t==null?Kt:Gl(t,n,Un,!0)}function er(e,t,n,s){return t==null?Kt:$l(t,n,e.scales[s].log,!1)}var Qa=er;function tr(e,t,n,s){return t==null?Kt:qn(t,n,e.scales[s].log,!1)}var Xa=tr;function eu(e,t,n,s,r){let f=Le(ei(e),ei(t)),c=t-e,m=vt(r/s*c,n);do{let d=n[m],g=s*d/c;if(g>=r&&f+(d<5?Kl.get(d):0)<=17)return[d,g]}while(++m(t=Me((n=+r)*te))+"px"),[e,t,n]}function tu(e){e.show&&[e.font,e.labelFont].forEach(t=>{let n=oe(t[2]*te,1);t[0]=t[0].replace(/[0-9.]+px/,n+"px"),t[1]=n})}function Se(e,t,n){let s={mode:le(e.mode,1)},r=s.mode;function f(l,i){return((i.distr==3?Et(l>0?l:i.clamp(s,l,i.min,i.max,i.key)):i.distr==4?Rn(l,i.asinh):l)-i._min)/(i._max-i._min)}function c(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?1-h:h)}function m(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?h:1-h)}function d(l,i,o,a){return i.ori==0?c(l,i,o,a):m(l,i,o,a)}s.valToPosH=c,s.valToPosV=m;let g=!1;s.status=0;let _=s.root=et(io);if(e.id!=null&&(_.id=e.id),$e(_,e.class),e.title){let l=et(ao,_);l.textContent=e.title}let y=ct("canvas"),u=s.ctx=y.getContext("2d"),w=et(uo,_),k=s.under=et(co,w);w.appendChild(y);let M=s.over=et(fo,w);e=At(e);let L=+le(e.pxAlign,1),N=vi(L);(e.plugins||[]).forEach(l=>{l.opts&&(e=l.opts(s,e)||e)});let E=e.ms||.001,v=s.series=r==1?yi(e.series||[],pi,wi,!1):ja(e.series||[null],Va),C=s.axes=yi(e.axes||[],di,mi,!0),D=s.scales={},R=s.bands=e.bands||[];R.forEach(l=>{l.fill=ee(l.fill||null),l.dir=le(l.dir,-1)});let A=r==2?v[1].facets[0].scale:v[0].scale,W={axes:Fr,series:Ar},Y=(e.drawOrder||["axes","series"]).map(l=>W[l]);function $(l){let i=D[l];if(i==null){let o=(e.scales||Sl)[l]||Sl;if(o.from!=null)$(o.from),D[l]=we({},D[o.from],o,{key:l});else{i=D[l]=we({},l==A?Bi:Na,o),i.key=l;let a=i.time,h=i.range,p=Dt(h);if((l!=A||r==2&&!a)&&(p&&(h[0]==null||h[1]==null)&&(h={min:h[0]==null?Qs:{mode:1,hard:h[0],soft:h[0]},max:h[1]==null?Qs:{mode:1,hard:h[1],soft:h[1]}},p=!1),!p&&jl(h))){let S=h;h=(b,T,V)=>T==null?Kt:Gl(T,V,S)}i.range=ee(h||(a?Ja:l==A?i.distr==3?Qa:i.distr==4?Xa:Xi:i.distr==3?er:i.distr==4?tr:Za)),i.auto=ee(p?!1:i.auto),i.clamp=ee(i.clamp||Fa),i._min=i._max=null}}}$("x"),$("y"),r==1&&v.forEach(l=>{$(l.scale)}),C.forEach(l=>{$(l.scale)});for(let l in e.scales)$(l);let P=D[A],U=P.distr,re,Z;P.ori==0?($e(_,ro),re=c,Z=m):($e(_,oo),re=m,Z=c);let F={};for(let l in D){let i=D[l];(i.min!=null||i.max!=null)&&(F[l]={min:i.min,max:i.max},i.min=i.max=null)}let X=e.tzDate||(l=>new Date(Me(l/E))),O=e.fmtDate||jn,Re=E==1?ra(X):ua(X),Te=ci(X,ui(E==1?ia:aa,O)),Fe=hi(X,fi(fa,O)),H=[],I=s.legend=we({},pa,e.legend),De=I.show,de=I.markers;I.idxs=H,de.width=ee(de.width),de.dash=ee(de.dash),de.stroke=ee(de.stroke),de.fill=ee(de.fill);let Je,st=[],ht=[],dt,Ze=!1,ot={};if(I.live){let l=v[1]?v[1].values:null;Ze=l!=null,dt=Ze?l(s,1,0):{_:0};for(let i in dt)ot[i]="--"}if(De)if(Je=ct("table",So,_),Ze){let l=ct("tr",yo,Je);ct("th",null,l);for(var Qt in dt)ct("th",Hs,l).textContent=Qt}else $e(Je,_o),I.live&&$e(Je,vo);let Vt={show:!0},on={show:!1};function bl(l,i){if(i==0&&(Ze||!I.live||r==2))return Kt;let o=[],a=ct("tr",bo,Je,Je.childNodes[i]);$e(a,l.class),l.show||$e(a,Tt);let h=ct("th",null,a);if(de.show){let b=et(ko,h);if(i>0){let T=de.width(s,i);T&&(b.style.border=T+"px "+de.dash(s,i)+" "+de.stroke(s,i)),b.style.background=de.fill(s,i)}}let p=et(Hs,h);p.textContent=l.label,i>0&&(de.show||(p.style.color=l.width>0?de.stroke(s,i):de.fill(s,i)),Qe("click",h,b=>{if(B._lock)return;let T=v.indexOf(l);if((b.ctrlKey||b.metaKey)!=I.isolate){let V=v.some((x,z)=>z>0&&z!=T&&x.show);v.forEach((x,z)=>{z>0&&rt(z,V?z==T?Vt:on:Vt,!0,Ae.setSeries)})}else rt(T,{show:!l.show},!0,Ae.setSeries)}),Ml&&Qe(Gs,h,b=>{B._lock||rt(v.indexOf(l),Ht,!0,Ae.setSeries)}));for(var S in dt){let b=ct("td",xo,a);b.textContent="--",o.push(b)}return[a,o]}let pt=new Map;function Qe(l,i,o){let a=pt.get(i)||{},h=B.bind[l](s,i,o);h&&(Ct(l,i,a[l]=h),pt.set(i,a))}function ne(l,i,o){let a=pt.get(i)||{};for(let h in a)(l==null||h==l)&&(In(h,i,a[h]),delete a[h]);l==null&&pt.delete(i)}let Ne=0,qe=0,G=0,j=0,pe=0,_e=0,ye=0,He=0,tt=0,yt=0;s.bbox={};let an=!1,kl=!1,Ft=!1,Xt=!1,it=!1;function un(l,i,o){(o||l!=s.width||i!=s.height)&&rs(l,i),ll(!1),Ft=!0,kl=!0,Xt=it=B.left>=0,kt()}function rs(l,i){s.width=Ne=G=l,s.height=qe=j=i,pe=_e=0,kr(),xr();let o=s.bbox;ye=o.left=Mt(pe*te,.5),He=o.top=Mt(_e*te,.5),tt=o.width=Mt(G*te,.5),yt=o.height=Mt(j*te,.5)}let _r=3;function yr(){let l=!1,i=0;for(;!l;){i++;let o=zr(i),a=Vr(i);l=i==_r||o&&a,l||(rs(s.width,s.height),kl=!0)}}function br({width:l,height:i}){un(l,i)}s.setSize=br;function kr(){let l=!1,i=!1,o=!1,a=!1;C.forEach((h,p)=>{if(h.show&&h._show){let{side:S,_size:b}=h,T=S%2,V=h.label!=null?h.labelSize:0,x=b+V;x>0&&(T?(G-=x,S==3?(pe+=x,a=!0):o=!0):(j-=x,S==0?(_e+=x,l=!0):i=!0))}}),bt[0]=l,bt[1]=o,bt[2]=i,bt[3]=a,G-=mt[1]+mt[3],pe+=mt[3],j-=mt[2]+mt[0],_e+=mt[0]}function xr(){let l=pe+G,i=_e+j,o=pe,a=_e;function h(p,S){switch(p){case 1:return l+=S,l-S;case 2:return i+=S,i-S;case 3:return o-=S,o+S;case 0:return a-=S,a+S}}C.forEach((p,S)=>{if(p.show&&p._show){let b=p.side;p._pos=h(b,p._size),p.label!=null&&(p._lpos=h(b,p.labelSize))}})}let B=s.cursor=we({},ya,{drag:{y:r==2}},e.cursor);{B.idxs=H,B._lock=!1;let l=B.points;l.show=ee(l.show),l.size=ee(l.size),l.stroke=ee(l.stroke),l.width=ee(l.width),l.fill=ee(l.fill)}let xl=s.focus=we({},e.focus||{alpha:.3},B.focus),Ml=xl.prox>=0,Ie=[null];function Mr(l,i){if(i>0){let o=B.points.show(s,i);if(o)return $e(o,wo),$e(o,l.class),Gt(o,-10,-10,G,j),M.insertBefore(o,Ie[i]),o}}function os(l,i){if(r==1||i>0){let o=r==1&&D[l.scale].time,a=l.value;l.value=o?si(a)?hi(X,fi(a,O)):a||Fe:a||Ra,l.label=l.label||(o?xa:ka)}if(i>0){l.width=l.width==null?1:l.width,l.paths=l.paths||$a||Oo,l.fillTo=ee(l.fillTo||Oa),l.pxAlign=+le(l.pxAlign,L),l.pxRound=vi(l.pxAlign),l.stroke=ee(l.stroke||null),l.fill=ee(l.fill||null),l._stroke=l._fill=l._paths=l._focus=null;let o=Wi(l.width,1),a=l.points=we({},{size:o,width:Le(1,o*.2),stroke:l.stroke,space:o*2,paths:Ka,_stroke:null,_fill:null},l.points);a.show=ee(a.show),a.filter=ee(a.filter),a.fill=ee(a.fill),a.stroke=ee(a.stroke),a.paths=ee(a.paths),a.pxAlign=l.pxAlign}if(De){let o=bl(l,i);st.splice(i,0,o[0]),ht.splice(i,0,o[1]),I.values.push(null)}if(B.show){H.splice(i,0,null);let o=Mr(l,i);o&&Ie.splice(i,0,o)}Pe("addSeries",i)}function Tr(l,i){i=i??v.length,l=Qi(l,i,pi,wi),v.splice(i,0,l),os(v[i],i)}s.addSeries=Tr;function Dr(l){if(v.splice(l,1),De){I.values.splice(l,1),ht.splice(l,1);let i=st.splice(l,1)[0];ne(null,i.firstChild),i.remove()}B.show&&(H.splice(l,1),Ie.length>1&&Ie.splice(l,1)[0].remove()),Pe("delSeries",l)}s.delSeries=Dr;let bt=[!1,!1,!1,!1];function Cr(l,i){if(l._show=l.show,l.show){let o=l.side%2,a=D[l.scale];a==null&&(l.scale=o?v[1].scale:A,a=D[l.scale]);let h=a.time;l.size=ee(l.size),l.space=ee(l.space),l.rotate=ee(l.rotate),l.incrs=ee(l.incrs||(a.distr==2?ta:h?E==1?sa:oa:la)),l.splits=ee(l.splits||(h&&a.distr==1?Re:a.distr==3?Wn:a.distr==4?Da:Ta)),l.stroke=ee(l.stroke),l.grid.stroke=ee(l.grid.stroke),l.ticks.stroke=ee(l.ticks.stroke),l.border.stroke=ee(l.border.stroke);let p=l.values;l.values=Dt(p)&&!Dt(p[0])?ee(p):h?Dt(p)?ci(X,ui(p,O)):si(p)?ca(X,p):p||Te:p||Ma,l.filter=ee(l.filter||(a.distr>=3?La:Mi)),l.font=bi(l.font),l.labelFont=bi(l.labelFont),l._size=l.size(s,null,i,0),l._space=l._rotate=l._incrs=l._found=l._splits=l._values=null,l._size>0&&(bt[i]=!0,l._el=et(ho,w))}}function el(l,i,o,a){let[h,p,S,b]=o,T=i%2,V=0;return T==0&&(b||p)&&(V=i==0&&!h||i==2&&!S?Me(di.size/3):0),T==1&&(h||S)&&(V=i==1&&!p||i==3&&!b?Me(mi.size/2):0),V}let as=s.padding=(e.padding||[el,el,el,el]).map(l=>ee(le(l,el))),mt=s._padding=as.map((l,i)=>l(s,i,bt,0)),be,Ce=null,Ee=null,Tl=r==1?v[0].idxs:null,lt=null,Dl=!1;function us(l,i){if(t=l==null?[]:At(l,ii),r==2){be=0;for(let o=1;o=0,it=!0,kt()}}s.setData=us;function cn(){Dl=!0;let l,i;r==1&&(be>0?(Ce=Tl[0]=0,Ee=Tl[1]=be-1,l=t[0][Ce],i=t[0][Ee],U==2?(l=Ce,i=Ee):be==1&&(U==3?[l,i]=$l(l,l,P.log,!1):U==4?[l,i]=qn(l,l,P.log,!1):P.time?i=l+Me(86400/E):[l,i]=Gl(l,i,Un,!0))):(Ce=Tl[0]=l=null,Ee=Tl[1]=i=null)),Ot(A,l,i)}let Cl,Nt,fn,hn,dn,pn,mn,gn,wn,tl;function cs(l=Ws,i,o=Di,a="butt",h=Ws,p="round"){l!=Cl&&(u.strokeStyle=Cl=l),h!=Nt&&(u.fillStyle=Nt=h),i!=fn&&(u.lineWidth=fn=i),p!=dn&&(u.lineJoin=dn=p),a!=pn&&(u.lineCap=pn=a),o!=hn&&u.setLineDash(hn=o)}function fs(l,i,o,a){i!=Nt&&(u.fillStyle=Nt=i),l!=mn&&(u.font=mn=l),o!=gn&&(u.textAlign=gn=o),a!=wn&&(u.textBaseline=wn=a)}function Sn(l,i,o,a,h=0){if(a.length>0&&l.auto(s,Dl)&&(i==null||i.min==null)){let p=le(Ce,0),S=le(Ee,a.length-1),b=o.min==null?l.distr==3?Ao(a,p,S):Po(a,p,S,h):[o.min,o.max];l.min=Ge(l.min,o.min=b[0]),l.max=Le(l.max,o.max=b[1])}}function Er(){let l=At(D,ii);for(let a in l){let h=l[a],p=F[a];if(p!=null&&p.min!=null)we(h,p),a==A&&ll(!0);else if(a!=A||r==2)if(be==0&&h.from==null){let S=h.range(s,null,null,a);h.min=S[0],h.max=S[1]}else h.min=Q,h.max=-Q}if(be>0){v.forEach((a,h)=>{if(r==1){let p=a.scale,S=l[p],b=F[p];if(h==0){let T=S.range(s,S.min,S.max,p);S.min=T[0],S.max=T[1],Ce=vt(S.min,t[0]),Ee=vt(S.max,t[0]),t[0][Ce]S.max&&Ee--,a.min=lt[Ce],a.max=lt[Ee]}else a.show&&a.auto&&Sn(S,b,a,t[h],a.sorted);a.idxs[0]=Ce,a.idxs[1]=Ee}else if(h>0&&a.show&&a.auto){let[p,S]=a.facets,b=p.scale,T=S.scale,[V,x]=t[h];Sn(l[b],F[b],p,V,p.sorted),Sn(l[T],F[T],S,x,S.sorted),a.min=S.min,a.max=S.max}});for(let a in l){let h=l[a],p=F[a];if(h.from==null&&(p==null||p.min==null)){let S=h.range(s,h.min==Q?null:h.min,h.max==-Q?null:h.max,a);h.min=S[0],h.max=S[1]}}}for(let a in l){let h=l[a];if(h.from!=null){let p=l[h.from];if(p.min==null)h.min=h.max=null;else{let S=h.range(s,p.min,p.max,a);h.min=S[0],h.max=S[1]}}}let i={},o=!1;for(let a in l){let h=l[a],p=D[a];if(p.min!=h.min||p.max!=h.max){p.min=h.min,p.max=h.max;let S=p.distr;p._min=S==3?Et(p.min):S==4?Rn(p.min,p.asinh):p.min,p._max=S==3?Et(p.max):S==4?Rn(p.max,p.asinh):p.max,i[a]=o=!0}}if(o){v.forEach((a,h)=>{r==2?h>0&&i.y&&(a._paths=null):i[a.scale]&&(a._paths=null)});for(let a in i)Ft=!0,Pe("setScale",a);B.show&&(Xt=it=B.left>=0)}for(let a in F)F[a]=null}function Pr(l){let i=ti(Ce-1,0,be-1),o=ti(Ee+1,0,be-1);for(;l[i]==null&&i>0;)i--;for(;l[o]==null&&o0&&(v.forEach((l,i)=>{if(i>0&&l.show&&l._paths==null){let o=Pr(t[i]);l._paths=l.paths(s,i,o[0],o[1])}}),v.forEach((l,i)=>{if(i>0&&l.show){tl!=l.alpha&&(u.globalAlpha=tl=l.alpha),hs(i,!1),l._paths&&ds(i,!1);{hs(i,!0);let o=l.points.show(s,i,Ce,Ee),a=l.points.filter(s,i,o,l._paths?l._paths.gaps:null);(o||a)&&(l.points._paths=l.points.paths(s,i,Ce,Ee,a),ds(i,!0))}tl!=1&&(u.globalAlpha=tl=1),Pe("drawSeries",i)}}))}function hs(l,i){let o=i?v[l].points:v[l];o._stroke=o.stroke(s,l),o._fill=o.fill(s,l)}function ds(l,i){let o=i?v[l].points:v[l],a=o._stroke,h=o._fill,{stroke:p,fill:S,clip:b,flags:T}=o._paths,V=null,x=oe(o.width*te,3),z=x%2/2;i&&h==null&&(h=x>0?"#fff":a);let q=o.pxAlign==1;if(q&&u.translate(z,z),!i){let me=ye,K=He,ae=tt,J=yt,se=x*te/2;o.min==0&&(J+=se),o.max==0&&(K-=se,J+=se),V=new Path2D,V.rect(me,K,ae,J)}i?vn(a,x,o.dash,o.cap,h,p,S,T,b):Lr(l,a,x,o.dash,o.cap,h,p,S,T,V,b),q&&u.translate(-z,-z)}function Lr(l,i,o,a,h,p,S,b,T,V,x){let z=!1;R.forEach((q,me)=>{if(q.series[0]==l){let K=v[q.series[1]],ae=t[q.series[1]],J=(K._paths||Sl).band;Dt(J)&&(J=q.dir==1?J[0]:J[1]);let se,ge=null;K.show&&J&&Ro(ae,Ce,Ee)?(ge=q.fill(s,me)||p,se=K._paths.clip):J=null,vn(i,o,a,h,ge,S,b,T,V,x,se,J),z=!0}}),z||vn(i,o,a,h,p,S,b,T,V,x)}let ps=Lt|Ul;function vn(l,i,o,a,h,p,S,b,T,V,x,z){cs(l,i,o,a,h),(T||V||z)&&(u.save(),T&&u.clip(T),V&&u.clip(V)),z?(b&ps)==ps?(u.clip(z),x&&u.clip(x),Pl(h,S),El(l,p,i)):b&Ul?(Pl(h,S),u.clip(z),El(l,p,i)):b&Lt&&(u.save(),u.clip(z),x&&u.clip(x),Pl(h,S),u.restore(),El(l,p,i)):(Pl(h,S),El(l,p,i)),(T||V||z)&&u.restore()}function El(l,i,o){o>0&&(i instanceof Map?i.forEach((a,h)=>{u.strokeStyle=Cl=h,u.stroke(a)}):i!=null&&l&&u.stroke(i))}function Pl(l,i){i instanceof Map?i.forEach((o,a)=>{u.fillStyle=Nt=a,u.fill(o)}):i!=null&&l&&u.fill(i)}function Rr(l,i,o,a){let h=C[l],p;if(a<=0)p=[0,0];else{let S=h._space=h.space(s,l,i,o,a),b=h._incrs=h.incrs(s,l,i,o,a,S);p=eu(i,o,b,a,S)}return h._found=p}function _n(l,i,o,a,h,p,S,b,T,V){let x=S%2/2;L==1&&u.translate(x,x),cs(b,S,T,V,b),u.beginPath();let z,q,me,K,ae=h+(a==0||a==3?-p:p);o==0?(q=h,K=ae):(z=h,me=ae);for(let J=0;J{if(!o.show)return;let h=D[o.scale];if(h.min==null){o._show&&(i=!1,o._show=!1,ll(!1));return}else o._show||(i=!1,o._show=!0,ll(!1));let p=o.side,S=p%2,{min:b,max:T}=h,[V,x]=Rr(a,b,T,S==0?G:j);if(x==0)return;let z=h.distr==2,q=o._splits=o.splits(s,a,b,T,V,x,z),me=h.distr==2?q.map(se=>lt[se]):q,K=h.distr==2?lt[q[1]]-lt[q[0]]:V,ae=o._values=o.values(s,o.filter(s,me,a,x,K),a,x,K);o._rotate=p==2?o.rotate(s,ae,a,x):0;let J=o._size;o._size=Kn(o.size(s,ae,a,l)),J!=null&&o._size!=J&&(i=!1)}),i}function Vr(l){let i=!0;return as.forEach((o,a)=>{let h=o(s,a,bt,l);h!=mt[a]&&(i=!1),mt[a]=h}),i}function Fr(){for(let l=0;llt[nt]):K,J=x.distr==2?lt[K[1]]-lt[K[0]]:T,se=i.ticks,ge=i.border,We=se.show?Me(se.size*te):0,ue=i._rotate*-Bl/180,Ve=N(i._pos*te),Be=(We+me)*b,Oe=Ve+Be;p=a==0?Oe:0,h=a==1?Oe:0;let Ue=i.font[0],wt=i.align==1?Yt:i.align==2?Pn:ue>0?Yt:ue<0?Pn:a==0?"center":o==3?Pn:Yt,St=ue||a==1?"middle":o==2?hl:Is;fs(Ue,S,wt,St);let Es=i.font[1]*ba,Nl=K.map(nt=>N(d(nt,x,z,q))),Ps=i._values;for(let nt=0;nt{o>0&&(i._paths=null,l&&(r==1?(i.min=null,i.max=null):i.facets.forEach(a=>{a.min=null,a.max=null})))})}let yn=!1;function kt(){yn||(Uo(Nr),yn=!0)}function Nr(){an&&(Er(),an=!1),Ft&&(yr(),Ft=!1),kl&&(ce(k,Yt,pe),ce(k,hl,_e),ce(k,pl,G),ce(k,ml,j),ce(M,Yt,pe),ce(M,hl,_e),ce(M,pl,G),ce(M,ml,j),ce(w,pl,Ne),ce(w,ml,qe),y.width=Me(Ne*te),y.height=Me(qe*te),C.forEach(({_el:l,_show:i,_size:o,_pos:a,side:h})=>{if(l!=null)if(i){let p=h===3||h===0?o:0,S=h%2==1;ce(l,S?"left":"top",a-p),ce(l,S?"width":"height",o),ce(l,S?"top":"left",S?_e:pe),ce(l,S?"height":"width",S?j:G),Hn(l,Tt)}else $e(l,Tt)}),Cl=Nt=fn=dn=pn=mn=gn=wn=hn=null,tl=1,Vl(!0),Pe("setSize"),kl=!1),Ne>0&&qe>0&&(u.clearRect(0,0,y.width,y.height),Pe("drawClear"),Y.forEach(l=>l()),Pe("draw")),B.show&&Xt&&(gt(null,!0,!1),Xt=!1),g||(g=!0,s.status=1,Pe("ready")),Dl=!1,yn=!1}s.redraw=(l,i)=>{Ft=i||!1,l!==!1?Ot(A,P.min,P.max):kt()};function bn(l,i){let o=D[l];if(o.from==null){if(be==0){let a=o.range(s,i.min,i.max,l);i.min=a[0],i.max=a[1]}if(i.min>i.max){let a=i.min;i.min=i.max,i.max=a}if(be>1&&i.min!=null&&i.max!=null&&i.max-i.min<1e-16)return;l==A&&o.distr==2&&be>0&&(i.min=vt(i.min,t[0]),i.max=vt(i.max,t[0]),i.min==i.max&&i.max++),F[l]=i,an=!0,kt()}}s.setScale=bn;let kn,xn,Al,Ll,ms,gs,nl,sl,ws,Ss,fe,he,xt=!1,ze=B.drag,ke=ze.x,xe=ze.y;B.show&&(B.x&&(kn=et(mo,M)),B.y&&(xn=et(go,M)),P.ori==0?(Al=kn,Ll=xn):(Al=xn,Ll=kn),fe=B.left,he=B.top);let Xe=s.select=we({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),il=Xe.show?et(po,Xe.over?M:k):null;function Rl(l,i){if(Xe.show){for(let o in l)ce(il,o,Xe[o]=l[o]);i!==!1&&Pe("setSelect")}}s.setSelect=Rl;function Or(l,i){let o=v[l],a=De?st[l]:null;o.show?a&&Hn(a,Tt):(a&&$e(a,Tt),Ie.length>1&&Gt(Ie[l],-10,-10,G,j))}function Ot(l,i,o){bn(l,{min:i,max:o})}function rt(l,i,o,a){i.focus!=null&&Yr(l),i.show!=null&&v.forEach((h,p)=>{p>0&&(l==p||l==null)&&(h.show=i.show,Or(p,i.show),Ot(r==2?h.facets[1].scale:h.scale,null,null),kt())}),o!==!1&&Pe("setSeries",l,i),a&&cl("setSeries",s,l,i)}s.setSeries=rt;function Hr(l,i){we(R[l],i)}function Ir(l,i){l.fill=ee(l.fill||null),l.dir=le(l.dir,-1),i=i??R.length,R.splice(i,0,l)}function Wr(l){l==null?R.length=0:R.splice(l,1)}s.addBand=Ir,s.setBand=Hr,s.delBand=Wr;function Br(l,i){v[l].alpha=i,B.show&&Ie[l]&&(Ie[l].style.opacity=i),De&&st[l]&&(st[l].style.opacity=i)}let rl,zl,ol,Ht={focus:!0};function Yr(l){if(l!=ol){let i=l==null,o=xl.alpha!=1;v.forEach((a,h)=>{let p=i||h==0||h==l;a._focus=i?null:p,o&&Br(h,p?1:xl.alpha)}),ol=l,o&&kt()}}De&&Ml&&Ct(qs,Je,l=>{B._lock||ol!=null&&rt(null,Ht,!0,Ae.setSeries)});function at(l,i,o){let a=D[i];o&&(l=l/te-(a.ori==1?_e:pe));let h=G;a.ori==1&&(h=j,l=h-l),a.dir==-1&&(l=h-l);let p=a._min,S=a._max,b=l/h,T=p+(S-p)*b,V=a.distr;return V==3?_t(10,T):V==4?Fo(T,a.asinh):T}function Gr(l,i){let o=at(l,A,i);return vt(o,t[0],Ce,Ee)}s.valToIdx=l=>vt(l,t[0]),s.posToIdx=Gr,s.posToVal=at,s.valToPos=(l,i,o)=>D[i].ori==0?c(l,D[i],o?tt:G,o?ye:0):m(l,D[i],o?yt:j,o?He:0);function qr(l){l(s),kt()}s.batch=qr,s.setCursor=(l,i,o)=>{fe=l.left,he=l.top,gt(null,i,o)};function vs(l,i){ce(il,Yt,Xe.left=l),ce(il,pl,Xe.width=i)}function _s(l,i){ce(il,hl,Xe.top=l),ce(il,ml,Xe.height=i)}let al=P.ori==0?vs:_s,ul=P.ori==1?vs:_s;function Ur(){if(De&&I.live)for(let l=r==2?1:0;l{(h>0||!Ze)&&bs(h,o)})}De&&I.live&&Ur(),it=!1,i!==!1&&Pe("setLegend")}s.setLegend=ys;function bs(l,i){let o;if(i==null)o=ot;else{let a=v[l],h=l==0&&U==2?lt:t[l];o=Ze?a.values(s,l,i):{_:a.value(s,h[i],l,i)}}I.values[l]=o}function gt(l,i,o){ws=fe,Ss=he,[fe,he]=B.move(s,fe,he),B.show&&(Al&&Gt(Al,Me(fe),0,G,j),Ll&&Gt(Ll,0,Me(he),G,j));let a,h=Ce>Ee;rl=Q;let p=P.ori==0?G:j,S=P.ori==1?G:j;if(fe<0||be==0||h){a=null;for(let b=0;b0&&Ie.length>1&&Gt(Ie[b],-10,-10,G,j);if(Ml&&rt(null,Ht,!0,l==null&&Ae.setSeries),I.live){H.fill(null),it=!0;for(let b=0;b0&&z.show){let se=ae==null?-10:Pt(Z(ae,r==1?D[z.scale]:D[z.facets[1].scale],S,0),.5);if(se>0&&r==1){let ue=Ye(se-he);ue<=rl&&(rl=ue,zl=x)}let ge,We;if(P.ori==0?(ge=J,We=se):(ge=se,We=J),it&&Ie.length>1){Co(Ie[x],B.points.fill(s,x),B.points.stroke(s,x));let ue,Ve,Be,Oe,Ue=!0,wt=B.points.bbox;if(wt!=null){Ue=!1;let St=wt(s,x);Be=St.left,Oe=St.top,ue=St.width,Ve=St.height}else Be=ge,Oe=We,ue=Ve=B.points.size(s,x);Eo(Ie[x],ue,Ve,Ue),Gt(Ie[x],Be,Oe,G,j)}}if(I.live){if(!it||x==0&&Ze)continue;bs(x,K)}}}if(B.idx=a,B.left=fe,B.top=he,it&&(I.idx=a,ys()),Xe.show&&xt)if(l!=null){let[b,T]=Ae.scales,[V,x]=Ae.match,[z,q]=l.cursor.sync.scales,me=l.cursor.drag;if(ke=me._x,xe=me._y,ke||xe){let{left:K,top:ae,width:J,height:se}=l.select,ge=l.scales[b].ori,We=l.posToVal,ue,Ve,Be,Oe,Ue,wt=b!=null&&V(b,z),St=T!=null&&x(T,q);wt&&ke?(ge==0?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[b],Oe=re(We(ue,z),Be,p,0),Ue=re(We(ue+Ve,z),Be,p,0),al(Ge(Oe,Ue),Ye(Ue-Oe))):al(0,p),St&&xe?(ge==1?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[T],Oe=Z(We(ue,q),Be,S,0),Ue=Z(We(ue+Ve,q),Be,S,0),ul(Ge(Oe,Ue),Ye(Ue-Oe))):ul(0,S)}else Tn()}else{let b=Ye(ws-ms),T=Ye(Ss-gs);if(P.ori==1){let q=b;b=T,T=q}ke=ze.x&&b>=ze.dist,xe=ze.y&&T>=ze.dist;let V=ze.uni;V!=null?ke&&xe&&(ke=b>=V,xe=T>=V,!ke&&!xe&&(T>b?xe=!0:ke=!0)):ze.x&&ze.y&&(ke||xe)&&(ke=xe=!0);let x,z;ke&&(P.ori==0?(x=nl,z=fe):(x=sl,z=he),al(Ge(x,z),Ye(z-x)),xe||ul(0,S)),xe&&(P.ori==1?(x=nl,z=fe):(x=sl,z=he),ul(Ge(x,z),Ye(z-x)),ke||al(0,p)),!ke&&!xe&&(al(0,0),ul(0,0))}if(ze._x=ke,ze._y=xe,l==null){if(o){if(Cs!=null){let[b,T]=Ae.scales;Ae.values[0]=b!=null?at(P.ori==0?fe:he,b):null,Ae.values[1]=T!=null?at(P.ori==1?fe:he,T):null}cl(Bs,s,fe,he,G,j,a)}if(Ml){let b=o&&Ae.setSeries,T=xl.prox;ol==null?rl<=T&&rt(zl,Ht,!0,b):rl>T?rt(null,Ht,!0,b):zl!=ol&&rt(zl,Ht,!0,b)}}g&&i!==!1&&Pe("setCursor")}let It=null;function Vl(l){l===!0?It=null:(It=M.getBoundingClientRect(),Pe("syncRect",It))}function ks(l,i,o,a,h,p,S){B._lock||(Mn(l,i,o,a,h,p,S,!1,l!=null),l!=null?gt(null,!0,!0):gt(i,!0,!1))}function Mn(l,i,o,a,h,p,S,b,T){if(It==null&&Vl(!1),l!=null)o=l.clientX-It.left,a=l.clientY-It.top;else{if(o<0||a<0){fe=-10,he=-10;return}let[V,x]=Ae.scales,z=i.cursor.sync,[q,me]=z.values,[K,ae]=z.scales,[J,se]=Ae.match,ge=i.axes[0].side%2==1,We=P.ori==0?G:j,ue=P.ori==1?G:j,Ve=ge?p:h,Be=ge?h:p,Oe=ge?a:o,Ue=ge?o:a;if(K!=null?o=J(V,K)?d(q,D[V],We,0):-10:o=We*(Oe/Ve),ae!=null?a=se(x,ae)?d(me,D[x],ue,0):-10:a=ue*(Ue/Be),P.ori==1){let wt=o;o=a,a=wt}}T&&((o<=1||o>=G-1)&&(o=Mt(o,G)),(a<=1||a>=j-1)&&(a=Mt(a,j))),b?(ms=o,gs=a,[nl,sl]=B.move(s,o,a)):(fe=o,he=a)}let $r={width:0,height:0};function Tn(){Rl($r,!1)}function xs(l,i,o,a,h,p,S){xt=!0,ke=xe=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!0,!1),l!=null&&(Qe(An,Nn,Ms),cl(Ys,s,nl,sl,G,j,null))}function Ms(l,i,o,a,h,p,S){xt=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!1,!0);let{left:b,top:T,width:V,height:x}=Xe,z=V>0||x>0;if(z&&Rl(Xe),ze.setScale&&z){let q=b,me=V,K=T,ae=x;if(P.ori==1&&(q=T,me=x,K=b,ae=V),ke&&Ot(A,at(q,A),at(q+me,A)),xe)for(let J in D){let se=D[J];J!=A&&se.from==null&&se.min!=Q&&Ot(J,at(K+ae,J),at(K,J))}Tn()}else B.lock&&(B._lock=!B._lock,B._lock||gt(null,!0,!1));l!=null&&(ne(An,Nn),cl(An,s,fe,he,G,j,null))}function Kr(l,i,o,a,h,p,S){if(!B._lock){let b=xt;if(xt){let T=!0,V=!0,x=10,z,q;P.ori==0?(z=ke,q=xe):(z=xe,q=ke),z&&q&&(T=fe<=x||fe>=G-x,V=he<=x||he>=j-x),z&&T&&(fe=fe{rt(o,a,!0,!1)},B.show&&(Qe(Ys,M,xs),Qe(Bs,M,ks),Qe(Gs,M,Vl),Qe(qs,M,Kr),Qe(Us,M,Ts),Bn.add(s),s.syncRect=Vl);let Fl=s.hooks=e.hooks||{};function Pe(l,i,o){l in Fl&&Fl[l].forEach(a=>{a.call(null,s,i,o)})}(e.plugins||[]).forEach(l=>{for(let i in l.hooks)Fl[i]=(Fl[i]||[]).concat(l.hooks[i])});let Ae=we({key:null,setSeries:!1,filters:{pub:li,sub:li},scales:[A,v[1]?v[1].scale:null],match:[ni,ni],values:[null,null]},B.sync);B.sync=Ae;let Cs=Ae.key,Dn=Yi(Cs);function cl(l,i,o,a,h,p,S){Ae.filters.pub(l,i,o,a,h,p,S)&&Dn.pub(l,i,o,a,h,p,S)}Dn.sub(s);function jr(l,i,o,a,h,p,S){Ae.filters.sub(l,i,o,a,h,p,S)&&Wt[l](null,i,o,a,h,p,S)}s.pub=jr;function Jr(){Dn.unsub(s),Bn.delete(s),pt.clear(),In(Yl,Ut,Ds),_.remove(),Pe("destroy")}s.destroy=Jr;function Cn(){Pe("init",e,t),us(t||e.data,!1),F[A]?bn(A,F[A]):cn(),un(e.width,e.height),gt(null,!0,!1),Rl(Xe,!1)}return v.forEach(os),C.forEach(Cr),n?n instanceof HTMLElement?(n.appendChild(_),Cn()):n(s,Cn):Cn(),s}Se.assign=we;Se.fmtNum=$n;Se.rangeNum=Gl;Se.rangeLog=$l;Se.rangeAsinh=qn;Se.orient=Rt;Se.pxRatio=te;Se.join=qo;Se.fmtDate=jn,Se.tzDate=Xo;Se.sync=Yi;{Se.addGap=Ha,Se.clipGaps=Zl;let e=Se.paths={points:ji};e.linear=Zi,e.stepped=Ba,e.bars=Ya,e.spline=qa}var lu=(e,t,n)=>su(e-t,n)+t,nu=(e,t)=>e-t;function su(e,t){return Math.floor(e/t)*t}function iu(e,t){let n=[...e.values()];t&&n.sort((f,c)=>t(f.value,c.value));let s=Array(n.length),r=Array(n.length);for(let f=0;f+e,tn=class{constructor(t,n){this.chart=t,this.datasets=new Map,this.options=n,this.bucketSize=lr(n),this.histOffset=0}handleMeasurements(t){t.forEach(({y:n})=>{if(n==null)return;n=lu(n,this.histOffset,this.bucketSize);let s=this.datasets.get(n);s?s.count++:this.datasets.set(n,{value:n,count:1})}),this.chart.setData(iu(this.datasets,nu))}static initialData(){return[[],[]]}static getConfig(t){let n=lr(t),s=Se.paths.bars({align:1,size:[1,1/0],gap:4});return{title:t.title,width:t.width,height:t.height,scales:{x:{time:!1,auto:!1,dir:1,range:r=>[r.data[0][0],r.data[0][r.data[0].length-1]+n]}},axes:[{incrs:()=>[0,1,2,3,4,5,6,7,8,9,10].map(r=>r*n),splits:(r,f,c,m,d,g)=>{let _=r.axes[f]._space,y=r.valToPos(r.data[0][0]+n,"x")-r.valToPos(r.data[0][0],"x"),u=r.data[0][0],w=r.data[0][r.data[0].length-1]+n,k=[],M=Math.ceil(_/y);for(let L=0,N=u;N<=w;L++,N+=n)!(L%M)&&k.push(N);return k}}],series:[{label:t.label,value:(r,f)=>f+`-${f+n} ${t.unit}`},{paths:s,points:{show:!1},...Ol.at(1),width:2,label:"Events"}]}}};var ru=e=>e.unit?{value:(t,n)=>n==null?"--":n.toFixed(3)+` ${e.unit}`}:{},sr=e=>({value:"{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}"}),ou=e=>e.unit?{values:(t,n,s)=>n.map(r=>+r.toFixed(2)+` ${e.unit}`)}:{},ir=e=>({space:55,values:[[3600*24*365,"{YYYY}",null,null,null,null,null,null,1],[3600*24*28,"{MMM}",` {YYYY}`,null,null,null,null,null,1],[3600*24,"{M}/{D}",` {YYYY}`,null,null,null,null,null,1],[3600,"{h}{aa}",` {M}/{D}/{YY}`,null,` @@ -12,6 +12,6 @@ {h}:{mm}{aa}`,null,1],[.001,":{ss}.{fff}",` {M}/{D}/{YY} {h}:{mm}{aa}`,null,` {M}/{D} {h}:{mm}{aa}`,null,` -{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=xu(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=ku(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function xu(e){return btoa(unescape(encodeURIComponent(e)))}function ku(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr},Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:Tu,params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})(); +{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=ku(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=xu(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function ku(e){return btoa(unescape(encodeURIComponent(e)))}function xu(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr};window.customHooks=window.customHooks||{};var Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:{...Tu,...window.customHooks},params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})(); /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT */ diff --git a/dist/js/app.js.map b/dist/js/app.js.map index e6da3c1a..ff4a9870 100644 --- a/dist/js/app.js.map +++ b/dist/js/app.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../assets/node_modules/nprogress/nprogress.js", "../../assets/js/app.js", "../../assets/js/metrics_live/color_wheel.js", "../../assets/node_modules/uplot/dist/uPlot.esm.js", "../../assets/js/metrics_live/histogram.js", "../../assets/js/metrics_live/index.js", "../../assets/js/request_logger_cookie/index.js", "../../assets/js/request_logger_query_parameter/index.js", "../../assets/js/request_logger_messages/index.js", "../../assets/js/color_bar_highlight/index.js", "../../assets/js/refresh/index.js", "../../assets/js/remember_refresh/index.js"], - "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: '
'\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: Hooks,\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"], - "mappings": "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", + "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: '
'\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nwindow.customHooks = window.customHooks || {}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: { ...Hooks, ...window.customHooks },\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"], + "mappings": "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", "names": [] } diff --git a/lib/phoenix/live_dashboard/layout_view.ex b/lib/phoenix/live_dashboard/layout_view.ex index 03b9365e..f2d637fd 100644 --- a/lib/phoenix/live_dashboard/layout_view.ex +++ b/lib/phoenix/live_dashboard/layout_view.ex @@ -37,4 +37,20 @@ defmodule Phoenix.LiveDashboard.LayoutView do ) end end + + defp custom_head_tags(assigns, key) do + case assigns do + %{^key => components} when is_list(components) -> + assigns = assign(assigns, :components, components) + + ~H""" + <%= for component <- @components do %> + <%= component.(assigns) %> + <% end %> + """ + + _ -> + nil + end + end end diff --git a/lib/phoenix/live_dashboard/layouts/dash.html.heex b/lib/phoenix/live_dashboard/layouts/dash.html.heex index 47f0999a..35c0b663 100644 --- a/lib/phoenix/live_dashboard/layouts/dash.html.heex +++ b/lib/phoenix/live_dashboard/layouts/dash.html.heex @@ -1,6 +1,7 @@ + <%= custom_head_tags(assigns, :after_opening_head_tag) %> @@ -8,6 +9,7 @@ <%= assigns[:page_title] || "Phoenix LiveDashboard" %> + <%= custom_head_tags(assigns, :before_closing_head_tag) %>
diff --git a/lib/phoenix/live_dashboard/page_builder.ex b/lib/phoenix/live_dashboard/page_builder.ex index fcf84b57..a8fa9d37 100644 --- a/lib/phoenix/live_dashboard/page_builder.ex +++ b/lib/phoenix/live_dashboard/page_builder.ex @@ -96,7 +96,7 @@ defmodule Phoenix.LiveDashboard.PageBuilder do We currently support `card/1`, `fields_card/1`, `row/1`, `shared_usage_card/1`, and `usage_card/1`; - and the live components `live_layered_graph/1`, `live_nav_bar/1`, + and the live components `live_layered_graph/1`, `live_nav_bar/1`, and `live_table/1`. ## Helpers @@ -105,6 +105,74 @@ defmodule Phoenix.LiveDashboard.PageBuilder do helpers are: `live_dashboard_path/2`, `live_dashboard_path/3`, `encode_app/1`, `encode_ets/1`, `encode_pid/1`, `encode_port/1`, and `encode_socket/1`. + + ## Custom Hooks + + If your page needs to register custom hooks, you can use the `register_after_opening_head_tag/2` + function. Because the hooks need to be available on the dead render in the layout, before the + LiveView's LiveSocket is configured, your need to do this inside an `on_mount` hook: + + ```elixir + defmodule MyAppWeb.MyLiveDashboardHooks do + import Phoenix.LiveView + import Phoenix.Component + + alias Phoenix.LiveDashboard.PageBuilder + + def on_mount(:default, _params, _session, socket) do + {:cont, PageBuilder.register_after_opening_head_tag(socket, &after_opening_head_tag/1)} + end + + defp after_opening_head_tag(assigns) do + ~H\"\"\" + + \"\"\" + end + end + + defmodule MyAppWeb.MyCustomPage do + ... + end + ``` + + And then add it to the list of `on_mount` hooks in the `live_dashboard` router configuration: + + ```elixir + live_dashboard "/dashboard", + additional_pages: [ + route_name: MyAppWeb.MyCustomPage + ], + on_mount: [ + MyAppWeb.MyLiveDashboardHooks + ] + ``` + + The LiveDashboard will merge the `window.customHooks` object into the hooks that are + configured on the LiveSocket. + + > #### Warning {: .warning} + > + > If you are building a library that will be used by others, ensure that you are + > not overwriting the `window.customHooks` object instead of extending it. + > + > Instead of `window.customHooks = {...}`, + > use `window.customHooks = {...(window.customHooks || {}), ...}`. + + Note that in order to use external libraries, you will either need to include them from + a CDN, or bundle them yourself and include them from your apps static paths. + + Also, you are responsible for ensuring that your Content Security Policy (CSP) allows + the hooks to be executed. If you are building a library that will be used by others, + consider including a valid nonce on your script tags. """ use Phoenix.Component @@ -971,6 +1039,30 @@ defmodule Phoenix.LiveDashboard.PageBuilder do live_dashboard_path(socket, route, node, old_params, new_params) end + @doc """ + Registers a component to be rendered after the opening head tag in the layout. + """ + def register_after_opening_head_tag(socket, component) do + register_head(socket, component, :after_opening_head_tag) + end + + @doc """ + Registers a component to be rendered before the closing head tag in the layout. + """ + def register_before_closing_head_tag(socket, component) do + register_head(socket, component, :before_closing_head_tag) + end + + defp register_head(socket, component, assign) do + case socket do + %{assigns: %{^assign => [_ | _]}} -> + update(socket, assign, fn existing -> [component | existing] end) + + _ -> + assign(socket, assign, [component]) + end + end + # TODO: Remove this and the conditional on Phoenix v1.7+ @compile {:no_warn_undefined, Phoenix.VerifiedRoutes} From e7728ddc560743d31e5b3ef7fe3b56a13ec51559 Mon Sep 17 00:00:00 2001 From: Steffen Deusch Date: Sun, 10 Nov 2024 12:51:19 +0100 Subject: [PATCH 2/2] provide window.LiveDashboard.registerCustomHooks function --- assets/js/app.js | 4 +- dist/js/app.js | 8 ++-- dist/js/app.js.map | 4 +- .../live_dashboard/layouts/dash.html.heex | 8 ++++ lib/phoenix/live_dashboard/page_builder.ex | 46 +++++++++++-------- mix.exs | 1 + mix.lock | 6 ++- 7 files changed, 48 insertions(+), 29 deletions(-) diff --git a/assets/js/app.js b/assets/js/app.js index dd0889c6..1cfd61ce 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -18,12 +18,10 @@ let Hooks = { PhxRememberRefresh: PhxRememberRefresh } -window.customHooks = window.customHooks || {} - let socketPath = document.querySelector("html").getAttribute("phx-socket") || "/live" let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") let liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, { - hooks: { ...Hooks, ...window.customHooks }, + hooks: { ...Hooks, ...window.LiveDashboard.customHooks }, params: (liveViewName) => { return { _csrf_token: csrfToken, diff --git a/dist/js/app.js b/dist/js/app.js index fa48cdd4..032d61e9 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -1,6 +1,6 @@ -(()=>{var Zr=Object.create;var Rs=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var Xr=Object.getOwnPropertyNames;var eo=Object.getPrototypeOf,to=Object.prototype.hasOwnProperty;var lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var no=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Xr(t))!to.call(e,r)&&r!==n&&Rs(e,r,{get:()=>t[r],enumerable:!(s=Qr(t,r))||s.enumerable});return e};var so=(e,t,n)=>(n=e!=null?Zr(eo(e)):{},no(t||!e||!e.__esModule?Rs(n,"default",{value:e,enumerable:!0}):n,e));var Vs=lo((En,zs)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof En=="object"?zs.exports=t():e.NProgress=t()})(En,function(){var e={};e.version="0.2.0";var t=e.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};e.configure=function(u){var w,k;for(w in u)k=u[w],k!==void 0&&u.hasOwnProperty(w)&&(t[w]=k);return this},e.status=null,e.set=function(u){var w=e.isStarted();u=n(u,t.minimum,1),e.status=u===1?null:u;var k=e.render(!w),M=k.querySelector(t.barSelector),L=t.speed,N=t.easing;return k.offsetWidth,f(function(E){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),c(M,r(u,L,N)),u===1?(c(k,{transition:"none",opacity:1}),k.offsetWidth,setTimeout(function(){c(k,{transition:"all "+L+"ms linear",opacity:0}),setTimeout(function(){e.remove(),E()},L)},L)):setTimeout(E,L)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var u=function(){setTimeout(function(){!e.status||(e.trickle(),u())},t.trickleSpeed)};return t.trickle&&u(),this},e.done=function(u){return!u&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(u){var w=e.status;return w?(typeof u!="number"&&(u=(1-w)*n(Math.random()*w,.1,.95)),w=n(w+u,0,.994),e.set(w)):e.start()},e.trickle=function(){return e.inc(Math.random()*t.trickleRate)},function(){var u=0,w=0;e.promise=function(k){return!k||k.state()==="resolved"?this:(w===0&&e.start(),u++,w++,k.always(function(){w--,w===0?(u=0,e.done()):e.set((u-w)/u)}),this)}}(),e.render=function(u){if(e.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");var w=document.createElement("div");w.id="nprogress",w.innerHTML=t.template;var k=w.querySelector(t.barSelector),M=u?"-100":s(e.status||0),L=document.querySelector(t.parent),N;return c(k,{transition:"all 0 linear",transform:"translate3d("+M+"%,0,0)"}),t.showSpinner||(N=w.querySelector(t.spinnerSelector),N&&y(N)),L!=document.body&&d(L,"nprogress-custom-parent"),L.appendChild(w),w},e.remove=function(){g(document.documentElement,"nprogress-busy"),g(document.querySelector(t.parent),"nprogress-custom-parent");var u=document.getElementById("nprogress");u&&y(u)},e.isRendered=function(){return!!document.getElementById("nprogress")},e.getPositioningCSS=function(){var u=document.body.style,w="WebkitTransform"in u?"Webkit":"MozTransform"in u?"Moz":"msTransform"in u?"ms":"OTransform"in u?"O":"";return w+"Perspective"in u?"translate3d":w+"Transform"in u?"translate":"margin"};function n(u,w,k){return uk?k:u}function s(u){return(-1+u)*100}function r(u,w,k){var M;return t.positionUsing==="translate3d"?M={transform:"translate3d("+s(u)+"%,0,0)"}:t.positionUsing==="translate"?M={transform:"translate("+s(u)+"%,0)"}:M={"margin-left":s(u)+"%"},M.transition="all "+w+"ms "+k,M}var f=function(){var u=[];function w(){var k=u.shift();k&&k(w)}return function(k){u.push(k),u.length==1&&w()}}(),c=function(){var u=["Webkit","O","Moz","ms"],w={};function k(E){return E.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(v,C){return C.toUpperCase()})}function M(E){var v=document.body.style;if(E in v)return E;for(var C=u.length,D=E.charAt(0).toUpperCase()+E.slice(1),R;C--;)if(R=u[C]+D,R in v)return R;return E}function L(E){return E=k(E),w[E]||(w[E]=M(E))}function N(E,v,C){v=L(v),E.style[v]=C}return function(E,v){var C=arguments,D,R;if(C.length==2)for(D in v)R=v[D],R!==void 0&&v.hasOwnProperty(D)&&N(E,D,R);else N(E,C[1],C[2])}}();function m(u,w){var k=typeof u=="string"?u:_(u);return k.indexOf(" "+w+" ")>=0}function d(u,w){var k=_(u),M=k+w;m(k,w)||(u.className=M.substring(1))}function g(u,w){var k=_(u),M;!m(u,w)||(M=k.replace(" "+w+" "," "),u.className=M.substring(1,M.length-1))}function _(u){return(" "+(u.className||"")+" ").replace(/\s+/gi," ")}function y(u){u&&u.parentNode&&u.parentNode.removeChild(u)}return e})});var ss=so(Vs());var Ns={phoenix:[242,110,64],elixir:[75,68,115],red:[255,99,132],orange:[255,159,64],yellow:[255,205,86],green:[75,192,192],blue:[54,162,253],purple:[153,102,255],grey:[201,203,207]},Fs=Object.keys(Ns),Os={at:e=>{let[t,n,s]=Os.rgb(e);return`rgb(${t}, ${n}, ${s})`},rgb:e=>Ns[Fs[e%Fs.length]]},Ol={at:e=>{let[t,n,s]=Os.rgb(e);return{stroke:`rgb(${t}, ${n}, ${s})`,fill:`rgb(${t}, ${n}, ${s}, 0.1)`}}};var ve="u-",io="uplot",ro=ve+"hz",oo=ve+"vt",ao=ve+"title",uo=ve+"wrap",co=ve+"under",fo=ve+"over",ho=ve+"axis",Tt=ve+"off",po=ve+"select",mo=ve+"cursor-x",go=ve+"cursor-y",wo=ve+"cursor-pt",So=ve+"legend",vo=ve+"live",_o=ve+"inline",yo=ve+"thead",bo=ve+"series",ko=ve+"marker",Hs=ve+"label",xo=ve+"value",pl="width",ml="height",hl="top",Is="bottom",Yt="left",Pn="right",Yn="#000",Ws=Yn+"0",Bs="mousemove",Ys="mousedown",An="mouseup",Gs="mouseenter",qs="mouseleave",Us="dblclick",Mo="resize",To="scroll",$s="change",Yl="dppxchange",jt=typeof window<"u",Nn=jt?document:null,Ut=jt?window:null,Do=jt?navigator:null,te,Hl;function On(){let e=devicePixelRatio;te!=e&&(te=e,Hl&&In($s,Hl,On),Hl=matchMedia(`(min-resolution: ${te-.001}dppx) and (max-resolution: ${te+.001}dppx)`),Ct($s,Hl,On),Ut.dispatchEvent(new CustomEvent(Yl)))}function $e(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Hn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function ce(e,t,n){e.style[t]=n+"px"}function ct(e,t,n,s){let r=Nn.createElement(e);return t!=null&&$e(r,t),n?.insertBefore(r,s),r}function et(e,t){return ct("div",e,t)}var Ks=new WeakMap;function Gt(e,t,n,s,r){let f="translate("+t+"px,"+n+"px)",c=Ks.get(e);f!=c&&(e.style.transform=f,Ks.set(e,f),t<0||n<0||t>s||n>r?$e(e,Tt):Hn(e,Tt))}var js=new WeakMap;function Co(e,t,n){let s=t+n,r=js.get(e);s!=r&&(js.set(e,s),e.style.background=t,e.style.borderColor=n)}var Js=new WeakMap;function Eo(e,t,n,s){let r=t+""+n,f=Js.get(e);r!=f&&(Js.set(e,r),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=s?-t/2+"px":0,e.style.marginTop=s?-n/2+"px":0)}var Gn={passive:!0},ki={...Gn,capture:!0};function Ct(e,t,n,s){t.addEventListener(e,n,s?ki:Gn)}function In(e,t,n,s){t.removeEventListener(e,n,s?ki:Gn)}jt&&On();function vt(e,t,n,s){let r;n=n||0,s=s||t.length-1;let f=s<=2147483647;for(;s-n>1;)r=f?n+s>>1:Ke((n+s)/2),t[r]=t&&r<=n;r+=s)if(e[r]!=null)return r;return-1}function Po(e,t,n,s){let r=Q,f=-Q;if(s==1)r=e[t],f=e[n];else if(s==-1)r=e[n],f=e[t];else for(let c=t;c<=n;c++)e[c]!=null&&(r=Ge(r,e[c]),f=Le(f,e[c]));return[r,f]}function Ao(e,t,n){let s=Q,r=-Q;for(let f=t;f<=n;f++)e[f]>0&&(s=Ge(s,e[f]),r=Le(r,e[f]));return[s==Q?1:s,r==-Q?10:r]}var Ln=[0,0];function Zs(e,t,n,s){return Ln[0]=n<0?oe(e,-n):e,Ln[1]=s<0?oe(t,-s):t,Ln}function $l(e,t,n,s){let r=Vo(e),f=n==10?Et:xi;e==t&&(r==-1?(e*=n,t/=n):(e/=n,t*=n));let c,m,d;return s?(c=Ke(f(e)),m=Kn(f(t)),d=Zs(_t(n,c),_t(n,m),c,m),e=d[0],t=d[1]):(c=Ke(f(Ye(e))),m=Ke(f(Ye(t))),d=Zs(_t(n,c),_t(n,m),c,m),e=Ti(e,d[0]),t=Pt(t,d[1])),[e,t]}function qn(e,t,n,s){let r=$l(e,t,n,s);return e==0&&(r[0]=0),t==0&&(r[1]=0),r}var Un=.1,Qs={mode:3,pad:Un},wl={pad:0,soft:null,mode:0},Lo={min:wl,max:wl};function Gl(e,t,n,s){return jl(n)?Xs(e,t,n):(wl.pad=n,wl.soft=s?0:null,wl.mode=s?3:0,Xs(e,t,Lo))}function le(e,t){return e??t}function Ro(e,t,n){for(t=le(t,0),n=le(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function Xs(e,t,n){let s=n.min,r=n.max,f=le(s.pad,0),c=le(r.pad,0),m=le(s.hard,-Q),d=le(r.hard,Q),g=le(s.soft,Q),_=le(r.soft,-Q),y=le(s.mode,0),u=le(r.mode,0),w=t-e;w<1e-9&&(w=0,(e==0||t==0)&&(w=1e-9,y==2&&g!=Q&&(f=0),u==2&&_!=-Q&&(c=0)));let k=w||Ye(t)||1e3,M=Et(k),L=_t(10,Ke(M)),N=k*(w==0?e==0?.1:1:f),E=oe(Ti(e-N,L/10),9),v=e>=g&&(y==1||y==3&&E<=g||y==2&&E>=g)?g:Q,C=Le(m,E=v?v:Ge(v,E)),D=k*(w==0?t==0?.1:1:c),R=oe(Pt(t+D,L/10),9),A=t<=_&&(u==1||u==3&&R>=_||u==2&&R<=_)?_:-Q,W=Ge(d,R>A&&t<=A?A:Le(A,R));return C==W&&C==0&&(W=100),[C,W]}var zo=new Intl.NumberFormat(jt?Do.language:"en-US"),$n=e=>zo.format(e),je=Math,Bl=je.PI,Ye=je.abs,Ke=je.floor,Me=je.round,Kn=je.ceil,Ge=je.min,Le=je.max,_t=je.pow,Vo=je.sign,Et=je.log10,xi=je.log2,Fo=(e,t=1)=>je.sinh(e)*t,Rn=(e,t=1)=>je.asinh(e/t),Q=1/0;function ei(e){return(Et((e^e>>31)-(e>>31))|0)+1}function Mt(e,t){return Me(e/t)*t}function ti(e,t,n){return Ge(Le(e,t),n)}function ee(e){return typeof e=="function"?e:()=>e}var No=e=>e,Mi=(e,t)=>t,Oo=e=>null,li=e=>!0,ni=(e,t)=>e==t;function Pt(e,t){return Kn(e/t)*t}function Ti(e,t){return Ke(e/t)*t}function oe(e,t){return Me(e*(t=10**t))/t}var Kl=new Map;function Ho(e){return((""+e).split(".")[1]||"").length}function vl(e,t,n,s){let r=[],f=s.map(Ho);for(let c=t;c=0&&c>=0?0:m)+(c>=f[g]?0:f[g]),u=oe(_,y);r.push(u),Kl.set(u,y)}}return r}var Sl={},Di=[],Kt=[null,null],Dt=Array.isArray;function si(e){return typeof e=="string"}function jl(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function ii(e){return e!=null&&typeof e=="object"}var Io=Object.getPrototypeOf(Uint8Array);function At(e,t=jl){let n;if(Dt(e)){let s=e.find(r=>r!=null);if(Dt(s)||t(s)){n=Array(e.length);for(let r=0;rf){for(r=c-1;r>=0&&e[r]==null;)e[r--]=null;for(r=c+1;rc-m)],r=s[0].length,f=new Map;for(let c=0;c"u"?e=>Promise.resolve().then(e):queueMicrotask,Ci=["January","February","March","April","May","June","July","August","September","October","November","December"],Ei=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function Pi(e){return e.slice(0,3)}var $o=Ei.map(Pi),Ko=Ci.map(Pi),jo={MMMM:Ci,MMM:Ko,WWWW:Ei,WWW:$o};function dl(e){return(e<10?"0":"")+e}function Jo(e){return(e<10?"00":e<100?"0":"")+e}var Zo={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>dl(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>dl(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>dl(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?"PM":"AM",aa:e=>e.getHours()>=12?"pm":"am",a:e=>e.getHours()>=12?"p":"a",mm:e=>dl(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>dl(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>Jo(e.getMilliseconds())};function jn(e,t){t=t||jo;let n=[],s=/\{([a-z]+)\}|[^{]+/gi,r;for(;r=s.exec(e);)n.push(r[0][0]=="{"?Zo[r[1]]:r[0]);return f=>{let c="";for(let m=0;me%1==0,ql=[1,2,2.5,5],ea=vl(10,-16,0,ql),Li=vl(10,0,16,ql),ta=Li.filter(Ai),la=ea.concat(Li),Jn=` -`,Ri="{YYYY}",ri=Jn+Ri,zi="{M}/{D}",gl=Jn+zi,Il=gl+"/{YY}",Vi="{aa}",na="{h}:{mm}",qt=na+Vi,oi=Jn+qt,ai=":{ss}",ie=null;function Fi(e){let t=e*1e3,n=t*60,s=n*60,r=s*24,f=r*30,c=r*365,d=(e==1?vl(10,0,3,ql).filter(Ai):vl(10,-3,0,ql)).concat([t,t*5,t*10,t*15,t*30,n,n*5,n*10,n*15,n*30,s,s*2,s*3,s*4,s*6,s*8,s*12,r,r*2,r*3,r*4,r*5,r*6,r*7,r*8,r*9,r*10,r*15,f,f*2,f*3,f*4,f*6,c,c*2,c*5,c*10,c*25,c*50,c*100]),g=[[c,Ri,ie,ie,ie,ie,ie,ie,1],[r*28,"{MMM}",ri,ie,ie,ie,ie,ie,1],[r,zi,ri,ie,ie,ie,ie,ie,1],[s,"{h}"+Vi,Il,ie,gl,ie,ie,ie,1],[n,qt,Il,ie,gl,ie,ie,ie,1],[t,ai,Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1],[e,ai+".{fff}",Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1]];function _(y){return(u,w,k,M,L,N)=>{let E=[],v=L>=c,C=L>=f&&L=r?r:L,$=Ke(k)-Ke(R),P=W+$+Pt(R-W,Y);E.push(P);let U=y(P),re=U.getHours()+U.getMinutes()/n+U.getSeconds()/s,Z=L/s,F=u.axes[w]._space,X=N/F;for(;P=oe(P+L,e==1?0:3),!(P>M);)if(Z>1){let O=Ke(oe(re+Z,6))%24,Fe=y(P).getHours()-O;Fe>1&&(Fe=-1),P-=Fe*s,re=(re+Z)%24;let H=E[E.length-1];oe((P-H)/L,3)*X>=.7&&E.push(P)}else E.push(P)}return E}}return[d,g,_]}var[sa,ia,ra]=Fi(1),[oa,aa,ua]=Fi(.001);vl(2,-53,53,[1]);function ui(e,t){return e.map(n=>n.map((s,r)=>r==0||r==8||s==null?s:t(r==1||n[8]==0?s:n[1]+s)))}function ci(e,t){return(n,s,r,f,c)=>{let m=t.find(k=>c>=k[0])||t[t.length-1],d,g,_,y,u,w;return s.map(k=>{let M=e(k),L=M.getFullYear(),N=M.getMonth(),E=M.getDate(),v=M.getHours(),C=M.getMinutes(),D=M.getSeconds(),R=L!=d&&m[2]||N!=g&&m[3]||E!=_&&m[4]||v!=y&&m[5]||C!=u&&m[6]||D!=w&&m[7]||m[1];return d=L,g=N,_=E,y=v,u=C,w=D,R(M)})}}function ca(e,t){let n=jn(t);return(s,r,f,c,m)=>r.map(d=>n(e(d)))}function zn(e,t,n){return new Date(e,t,n)}function fi(e,t){return t(e)}var fa="{YYYY}-{MM}-{DD} {h}:{mm}{aa}";function hi(e,t){return(n,s)=>t(e(s))}function ha(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null}function da(e,t){return e.series[t].fill(e,t)}var pa={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:ha,fill:da,dash:"solid"},idx:null,idxs:null,values:[]};function ma(e,t){let n=e.cursor.points,s=et(),r=n.size(e,t);ce(s,pl,r),ce(s,ml,r);let f=r/-2;ce(s,"marginLeft",f),ce(s,"marginTop",f);let c=n.width(e,t,r);return c&&ce(s,"borderWidth",c),s}function ga(e,t){let n=e.series[t].points;return n._fill||n._stroke}function wa(e,t){let n=e.series[t].points;return n._stroke||n._fill}function Sa(e,t){let n=e.series[t].points;return Wi(n.width,1)}function va(e,t,n){return n}var Vn=[0,0];function _a(e,t,n){return Vn[0]=t,Vn[1]=n,Vn}function Wl(e,t,n){return s=>{s.button==0&&n(s)}}function Fn(e,t,n){return n}var ya={show:!0,x:!0,y:!0,lock:!1,move:_a,points:{show:ma,size:Sa,width:0,stroke:wa,fill:ga},bind:{mousedown:Wl,mouseup:Wl,click:Wl,dblclick:Wl,mousemove:Fn,mouseleave:Fn,mouseenter:Fn},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:va,idxs:null},Ni={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Zn=we({},Ni,{filter:Mi}),Oi=we({},Zn,{size:10}),Hi=we({},Ni,{show:!1}),Qn='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Ii="bold "+Qn,ba=1.5,di={show:!0,scale:"x",stroke:Yn,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:2,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0},ka="Value",xa="Time",pi={show:!0,scale:"x",auto:!1,sorted:1,min:Q,max:-Q,idxs:[]};function Ma(e,t,n,s,r){return t.map(f=>f==null?"":$n(f))}function Ta(e,t,n,s,r,f,c){let m=[],d=Kl.get(r)||0;n=c?n:oe(Pt(n,r),d);for(let g=n;g<=s;g=oe(g+r,d))m.push(Object.is(g,-0)?0:g);return m}function Wn(e,t,n,s,r,f,c){let m=[],d=e.scales[e.axes[t].scale].log,g=d==10?Et:xi,_=Ke(g(n));r=_t(d,_),_<0&&(r=oe(r,-_));let y=n;do m.push(y),y=oe(y+r,Kl.get(r)),y>=r*d&&(r=y);while(y<=s);return m}function Da(e,t,n,s,r,f,c){let d=e.scales[e.axes[t].scale].asinh,g=s>d?Wn(e,t,Le(d,n),s,r):[d],_=s>=0&&n<=0?[0]:[];return(n<-d?Wn(e,t,Le(d,-s),-n,r):[d]).reverse().map(u=>-u).concat(_,g)}var Ca=/./,Ea=/[12357]/,Pa=/[125]/,Aa=/1/;function La(e,t,n,s,r){let f=e.axes[n],c=f.scale,m=e.scales[c];if(m.distr==3&&m.log==2)return t;let d=e.valToPos,g=f._space,_=d(10,c),y=d(9,c)-_>=g?Ca:d(7,c)-_>=g?Ea:d(5,c)-_>=g?Pa:Aa;return t.map(u=>m.distr==4&&u==0||y.test(u)?u:null)}function Ra(e,t){return t==null?"":$n(t)}var mi={show:!0,scale:"y",stroke:Yn,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:3,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0};function Wi(e,t){let n=3+(e||1)*2;return oe(n*t,3)}function za(e,t){let{scale:n,idxs:s}=e.series[0],r=e._data[0],f=e.valToPos(r[s[0]],n,!0),c=e.valToPos(r[s[1]],n,!0),m=Ye(c-f),d=e.series[t],g=m/(d.points.space*te);return s[1]-s[0]<=g}var gi={scale:null,auto:!0,sorted:0,min:Q,max:-Q},Va={show:!0,auto:!0,sorted:0,alpha:1,facets:[we({},gi,{scale:"x"}),we({},gi,{scale:"y"})]},wi={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:(e,t,n,s,r)=>r,alpha:1,points:{show:za,filter:null},values:null,min:Q,max:-Q,idxs:[],path:null,clip:null};function Fa(e,t,n,s,r){return n/10}var Bi={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Na=we({},Bi,{time:!1,ori:1}),Si={};function Yi(e,t){let n=Si[e];return n||(n={key:e,plots:[],sub(s){n.plots.push(s)},unsub(s){n.plots=n.plots.filter(r=>r!=s)},pub(s,r,f,c,m,d,g){for(let _=0;_{let N=c.pxRound,E=g.dir*(g.ori==0?1:-1),v=g.ori==0?Jt:Zt,C,D;E==1?(C=n,D=s):(C=s,D=n);let R=N(y(m[C],g,M,w)),A=N(u(d[C],_,L,k)),W=N(y(m[D],g,M,w)),Y=N(u(f==1?_.max:_.min,_,L,k)),$=new Path2D(r);return v($,W,Y),v($,R,Y),v($,R,A),$})}function Zl(e,t,n,s,r,f){let c=null;if(e.length>0){c=new Path2D;let m=t==0?en:es,d=n;for(let _=0;_y[0]){let u=y[0]-d;u>0&&m(c,d,s,u,s+f),d=y[1]}}let g=n+r-d;g>0&&m(c,d,s,g,s+f)}return c}function Ha(e,t,n){let s=e[e.length-1];s&&s[0]==t?s[1]=n:e.push([t,n])}function Xn(e,t,n,s,r,f,c){let m=[];for(let d=r==1?n:s;d>=n&&d<=s;d+=r)if(t[d]===null){let _=d,y=d;if(r==1)for(;++d<=s&&t[d]===null;)y=d;else for(;--d>=n&&t[d]===null;)y=d;let u=f(e[_]),w=y==_?u:f(e[y]);u=c<=0?f(e[_-r]):u,w=c>=0?f(e[y+r]):w,w>=u&&m.push([u,w])}return m}function vi(e){return e==0?No:e==1?Me:t=>Mt(t,e)}function Gi(e){let t=e==0?Ql:Xl,n=e==0?(r,f,c,m,d,g)=>{r.arcTo(f,c,m,d,g)}:(r,f,c,m,d,g)=>{r.arcTo(c,f,d,m,g)},s=e==0?(r,f,c,m,d)=>{r.rect(f,c,m,d)}:(r,f,c,m,d)=>{r.rect(c,f,d,m)};return(r,f,c,m,d,g=0)=>{g==0?s(r,f,c,m,d):(g=Ge(g,m/2,d/2),t(r,f+g,c),n(r,f+m,c,f+m,c+d,g),n(r,f+m,c+d,f,c+d,g),n(r,f,c+d,f,c,g),n(r,f,c,f+m,c,g),r.closePath())}}var Ql=(e,t,n)=>{e.moveTo(t,n)},Xl=(e,t,n)=>{e.moveTo(n,t)},Jt=(e,t,n)=>{e.lineTo(t,n)},Zt=(e,t,n)=>{e.lineTo(n,t)},en=Gi(0),es=Gi(1),qi=(e,t,n,s,r,f)=>{e.arc(t,n,s,r,f)},Ui=(e,t,n,s,r,f)=>{e.arc(n,t,s,r,f)},$i=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(t,n,s,r,f,c)},Ki=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(n,t,r,s,c,f)};function ji(e){return(t,n,s,r,f)=>Rt(t,n,(c,m,d,g,_,y,u,w,k,M,L)=>{let{pxRound:N,points:E}=c,v,C;g.ori==0?(v=Ql,C=qi):(v=Xl,C=Ui);let D=oe(E.width*te,3),R=(E.size-E.width)/2*te,A=oe(R*2,3),W=new Path2D,Y=new Path2D,{left:$,top:P,width:U,height:re}=t.bbox;en(Y,$-A,P-A,U+A*2,re+A*2);let Z=F=>{if(d[F]!=null){let X=N(y(m[F],g,M,w)),O=N(u(d[F],_,L,k));v(W,X+R,O),C(W,X,O,R,0,Bl*2)}};if(f)f.forEach(Z);else for(let F=s;F<=r;F++)Z(F);return{stroke:D>0?W:null,fill:W,clip:Y,flags:Lt|Ul}})}function Ji(e){return(t,n,s,r,f,c)=>{s!=r&&(f!=s&&c!=s&&e(t,n,s),f!=r&&c!=r&&e(t,n,r),e(t,n,c))}}var Ia=Ji(Jt),Wa=Ji(Zt);function Zi(e){let t=le(e?.alignGaps,0);return(n,s,r,f)=>Rt(n,s,(c,m,d,g,_,y,u,w,k,M,L)=>{let N=c.pxRound,E=H=>N(y(H,g,M,w)),v=H=>N(u(H,_,L,k)),C,D;g.ori==0?(C=Jt,D=Ia):(C=Zt,D=Wa);let R=g.dir*(g.ori==0?1:-1),A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=Q,$=-Q,P,U,re,Z=E(m[R==1?r:f]),F=$t(d,r,f,1*R),X=$t(d,r,f,-1*R),O=E(m[F]),Re=E(m[X]);for(let H=R==1?r:f;H>=r&&H<=f;H+=R){let I=E(m[H]);I==Z?d[H]!=null&&(U=v(d[H]),Y==Q&&(C(W,I,U),P=U),Y=Ge(U,Y),$=Le(U,$)):(Y!=Q&&(D(W,Z,Y,$,P,U),re=Z),d[H]!=null?(U=v(d[H]),C(W,I,U),Y=$=P=U):(Y=Q,$=-Q),Z=I)}Y!=Q&&Y!=$&&re!=Z&&D(W,Z,Y,$,P,U);let[Te,Fe]=Jl(n,s);if(c.fill!=null||Te!=0){let H=A.fill=new Path2D(W),I=c.fillTo(n,s,c.min,c.max,Te),De=v(I);C(H,Re,De),C(H,O,De)}if(!c.spanGaps){let H=[];H.push(...Xn(m,d,r,f,R,E,t)),A.gaps=H=c.gaps(n,s,r,f,H),A.clip=Zl(H,g.ori,w,k,M,L)}return Fe!=0&&(A.band=Fe==2?[ft(n,s,r,f,W,-1),ft(n,s,r,f,W,1)]:ft(n,s,r,f,W,Fe)),A})}function Ba(e){let t=le(e.align,1),n=le(e.ascDesc,!1),s=le(e.alignGaps,0);return(r,f,c,m)=>Rt(r,f,(d,g,_,y,u,w,k,M,L,N,E)=>{let v=d.pxRound,C=F=>v(w(F,y,N,M)),D=F=>v(k(F,u,E,L)),R=y.ori==0?Jt:Zt,A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=y.dir*(y.ori==0?1:-1);c=$t(_,c,m,1),m=$t(_,c,m,-1);let $=D(_[Y==1?c:m]),P=C(g[Y==1?c:m]),U=P;R(W,P,$);for(let F=Y==1?c:m;F>=c&&F<=m;F+=Y){let X=_[F];if(X==null)continue;let O=C(g[F]),Re=D(X);t==1?R(W,O,$):R(W,U,Re),R(W,O,Re),$=Re,U=O}let[re,Z]=Jl(r,f);if(d.fill!=null||re!=0){let F=A.fill=new Path2D(W),X=d.fillTo(r,f,d.min,d.max,re),O=D(X);R(F,U,O),R(F,P,O)}if(!d.spanGaps){let F=[];F.push(...Xn(g,_,c,m,Y,C,s));let X=d.width*te/2,O=n||t==1?X:-X,Re=n||t==-1?-X:X;F.forEach(Te=>{Te[0]+=O,Te[1]+=Re}),A.gaps=F=d.gaps(r,f,c,m,F),A.clip=Zl(F,y.ori,M,L,N,E)}return Z!=0&&(A.band=Z==2?[ft(r,f,c,m,W,-1),ft(r,f,c,m,W,1)]:ft(r,f,c,m,W,Z)),A})}function Ya(e){e=e||Sl;let t=le(e.size,[.6,Q,1]),n=e.align||0,s=(e.gap||0)*te,r=le(e.radius,0),f=1-t[0],c=le(t[1],Q)*te,m=le(t[2],1)*te,d=le(e.disp,Sl),g=le(e.each,u=>{}),{fill:_,stroke:y}=d;return(u,w,k,M)=>Rt(u,w,(L,N,E,v,C,D,R,A,W,Y,$)=>{let P=L.pxRound,U=v.dir*(v.ori==0?1:-1),re=C.dir*(C.ori==1?1:-1),Z=v.ori==0?en:es,F=v.ori==0?g:(ne,Ne,qe,G,j,pe,_e)=>{g(ne,Ne,qe,j,G,_e,pe)},[X,O]=Jl(u,w),Re=C.distr==3?X==1?C.max:C.min:0,Te=R(Re,C,$,W),Fe,H,I=P(L.width*te),De=!1,de=null,Je=null,st=null,ht=null;_!=null&&(I==0||y!=null)&&(De=!0,de=_.values(u,w,k,M),Je=new Map,new Set(de).forEach(ne=>{ne!=null&&Je.set(ne,new Path2D)}),I>0&&(st=y.values(u,w,k,M),ht=new Map,new Set(st).forEach(ne=>{ne!=null&&ht.set(ne,new Path2D)})));let{x0:dt,size:Ze}=d;if(dt!=null&&Ze!=null){N=dt.values(u,w,k,M),dt.unit==2&&(N=N.map(Ne=>u.posToVal(A+Ne*Y,v.key,!0)));let ne=Ze.values(u,w,k,M);Ze.unit==2?H=ne[0]*Y:H=D(ne[0],v,Y,A)-D(0,v,Y,A),H=P(H-I),Fe=U==1?-I/2:H+I/2}else{let ne=Y;if(N.length>1){let qe=null;for(let G=0,j=1/0;G=k&&ne<=M;ne+=U){let Ne=E[ne];if(Ne===void 0)continue;let qe=v.distr!=2||d!=null?N[ne]:ne,G=D(qe,v,Y,A),j=R(le(Ne,Re),C,$,W);Qe!=null&&Ne!=null&&(Te=R(Qe[ne],C,$,W));let pe=P(G-Fe),_e=P(Le(j,Te)),ye=P(Ge(j,Te)),He=_e-ye,tt=r*H;Ne!=null&&(De?(I>0&&st[ne]!=null&&Z(ht.get(st[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt),de[ne]!=null&&Z(Je.get(de[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt)):Z(Vt,pe,ye+Ke(I/2),H,Le(0,He-I),tt),F(u,w,ne,pe-I/2,ye,H+I,He)),O!=0&&(re*O==1?(_e=ye,ye=Qt):(ye=_e,_e=Qt),He=_e-ye,Z(on,pe-I/2,ye,H+I,Le(0,He),0))}return I>0&&(ot.stroke=De?ht:Vt),ot.fill=De?Je:Vt,ot})}function Ga(e,t){let n=le(t?.alignGaps,0);return(s,r,f,c)=>Rt(s,r,(m,d,g,_,y,u,w,k,M,L,N)=>{let E=m.pxRound,v=O=>E(u(O,_,L,k)),C=O=>E(w(O,y,N,M)),D,R,A;_.ori==0?(D=Ql,A=Jt,R=$i):(D=Xl,A=Zt,R=Ki);let W=_.dir*(_.ori==0?1:-1);f=$t(g,f,c,1),c=$t(g,f,c,-1);let Y=v(d[W==1?f:c]),$=Y,P=[],U=[];for(let O=W==1?f:c;O>=f&&O<=c;O+=W)if(g[O]!=null){let Te=d[O],Fe=v(Te);P.push($=Fe),U.push(C(g[O]))}let re={stroke:e(P,U,D,A,R,E),fill:null,clip:null,band:null,gaps:null,flags:Lt},Z=re.stroke,[F,X]=Jl(s,r);if(m.fill!=null||F!=0){let O=re.fill=new Path2D(Z),Re=m.fillTo(s,r,m.min,m.max,F),Te=C(Re);A(O,$,Te),A(O,Y,Te)}if(!m.spanGaps){let O=[];O.push(...Xn(d,g,f,c,W,v,n)),re.gaps=O=m.gaps(s,r,f,c,O),re.clip=Zl(O,_.ori,k,M,L,N)}return X!=0&&(re.band=X==2?[ft(s,r,f,c,Z,-1),ft(s,r,f,c,Z,1)]:ft(s,r,f,c,Z,X)),re})}function qa(e){return Ga(Ua,e)}function Ua(e,t,n,s,r,f){let c=e.length;if(c<2)return null;let m=new Path2D;if(n(m,e[0],t[0]),c==2)s(m,e[1],t[1]);else{let d=Array(c),g=Array(c-1),_=Array(c-1),y=Array(c-1);for(let u=0;u0!=g[u]>0?d[u]=0:(d[u]=3*(y[u-1]+y[u])/((2*y[u]+y[u-1])/g[u-1]+(y[u]+2*y[u-1])/g[u]),isFinite(d[u])||(d[u]=0));d[c-1]=g[c-2];for(let u=0;u{e.syncRect(!0)})}jt&&(Ct(Mo,Ut,_i),Ct(To,Ut,_i,!0),Ct(Yl,Ut,()=>{Se.pxRatio=te}));var $a=Zi(),Ka=ji();function yi(e,t,n,s){return(s?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((f,c)=>Qi(f,c,t,n))}function ja(e,t){return e.map((n,s)=>s==0?null:we({},t,n))}function Qi(e,t,n,s){return we({},t==0?n:s,e)}function Xi(e,t,n){return t==null?Kt:[t,n]}var Ja=Xi;function Za(e,t,n){return t==null?Kt:Gl(t,n,Un,!0)}function er(e,t,n,s){return t==null?Kt:$l(t,n,e.scales[s].log,!1)}var Qa=er;function tr(e,t,n,s){return t==null?Kt:qn(t,n,e.scales[s].log,!1)}var Xa=tr;function eu(e,t,n,s,r){let f=Le(ei(e),ei(t)),c=t-e,m=vt(r/s*c,n);do{let d=n[m],g=s*d/c;if(g>=r&&f+(d<5?Kl.get(d):0)<=17)return[d,g]}while(++m(t=Me((n=+r)*te))+"px"),[e,t,n]}function tu(e){e.show&&[e.font,e.labelFont].forEach(t=>{let n=oe(t[2]*te,1);t[0]=t[0].replace(/[0-9.]+px/,n+"px"),t[1]=n})}function Se(e,t,n){let s={mode:le(e.mode,1)},r=s.mode;function f(l,i){return((i.distr==3?Et(l>0?l:i.clamp(s,l,i.min,i.max,i.key)):i.distr==4?Rn(l,i.asinh):l)-i._min)/(i._max-i._min)}function c(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?1-h:h)}function m(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?h:1-h)}function d(l,i,o,a){return i.ori==0?c(l,i,o,a):m(l,i,o,a)}s.valToPosH=c,s.valToPosV=m;let g=!1;s.status=0;let _=s.root=et(io);if(e.id!=null&&(_.id=e.id),$e(_,e.class),e.title){let l=et(ao,_);l.textContent=e.title}let y=ct("canvas"),u=s.ctx=y.getContext("2d"),w=et(uo,_),k=s.under=et(co,w);w.appendChild(y);let M=s.over=et(fo,w);e=At(e);let L=+le(e.pxAlign,1),N=vi(L);(e.plugins||[]).forEach(l=>{l.opts&&(e=l.opts(s,e)||e)});let E=e.ms||.001,v=s.series=r==1?yi(e.series||[],pi,wi,!1):ja(e.series||[null],Va),C=s.axes=yi(e.axes||[],di,mi,!0),D=s.scales={},R=s.bands=e.bands||[];R.forEach(l=>{l.fill=ee(l.fill||null),l.dir=le(l.dir,-1)});let A=r==2?v[1].facets[0].scale:v[0].scale,W={axes:Fr,series:Ar},Y=(e.drawOrder||["axes","series"]).map(l=>W[l]);function $(l){let i=D[l];if(i==null){let o=(e.scales||Sl)[l]||Sl;if(o.from!=null)$(o.from),D[l]=we({},D[o.from],o,{key:l});else{i=D[l]=we({},l==A?Bi:Na,o),i.key=l;let a=i.time,h=i.range,p=Dt(h);if((l!=A||r==2&&!a)&&(p&&(h[0]==null||h[1]==null)&&(h={min:h[0]==null?Qs:{mode:1,hard:h[0],soft:h[0]},max:h[1]==null?Qs:{mode:1,hard:h[1],soft:h[1]}},p=!1),!p&&jl(h))){let S=h;h=(b,T,V)=>T==null?Kt:Gl(T,V,S)}i.range=ee(h||(a?Ja:l==A?i.distr==3?Qa:i.distr==4?Xa:Xi:i.distr==3?er:i.distr==4?tr:Za)),i.auto=ee(p?!1:i.auto),i.clamp=ee(i.clamp||Fa),i._min=i._max=null}}}$("x"),$("y"),r==1&&v.forEach(l=>{$(l.scale)}),C.forEach(l=>{$(l.scale)});for(let l in e.scales)$(l);let P=D[A],U=P.distr,re,Z;P.ori==0?($e(_,ro),re=c,Z=m):($e(_,oo),re=m,Z=c);let F={};for(let l in D){let i=D[l];(i.min!=null||i.max!=null)&&(F[l]={min:i.min,max:i.max},i.min=i.max=null)}let X=e.tzDate||(l=>new Date(Me(l/E))),O=e.fmtDate||jn,Re=E==1?ra(X):ua(X),Te=ci(X,ui(E==1?ia:aa,O)),Fe=hi(X,fi(fa,O)),H=[],I=s.legend=we({},pa,e.legend),De=I.show,de=I.markers;I.idxs=H,de.width=ee(de.width),de.dash=ee(de.dash),de.stroke=ee(de.stroke),de.fill=ee(de.fill);let Je,st=[],ht=[],dt,Ze=!1,ot={};if(I.live){let l=v[1]?v[1].values:null;Ze=l!=null,dt=Ze?l(s,1,0):{_:0};for(let i in dt)ot[i]="--"}if(De)if(Je=ct("table",So,_),Ze){let l=ct("tr",yo,Je);ct("th",null,l);for(var Qt in dt)ct("th",Hs,l).textContent=Qt}else $e(Je,_o),I.live&&$e(Je,vo);let Vt={show:!0},on={show:!1};function bl(l,i){if(i==0&&(Ze||!I.live||r==2))return Kt;let o=[],a=ct("tr",bo,Je,Je.childNodes[i]);$e(a,l.class),l.show||$e(a,Tt);let h=ct("th",null,a);if(de.show){let b=et(ko,h);if(i>0){let T=de.width(s,i);T&&(b.style.border=T+"px "+de.dash(s,i)+" "+de.stroke(s,i)),b.style.background=de.fill(s,i)}}let p=et(Hs,h);p.textContent=l.label,i>0&&(de.show||(p.style.color=l.width>0?de.stroke(s,i):de.fill(s,i)),Qe("click",h,b=>{if(B._lock)return;let T=v.indexOf(l);if((b.ctrlKey||b.metaKey)!=I.isolate){let V=v.some((x,z)=>z>0&&z!=T&&x.show);v.forEach((x,z)=>{z>0&&rt(z,V?z==T?Vt:on:Vt,!0,Ae.setSeries)})}else rt(T,{show:!l.show},!0,Ae.setSeries)}),Ml&&Qe(Gs,h,b=>{B._lock||rt(v.indexOf(l),Ht,!0,Ae.setSeries)}));for(var S in dt){let b=ct("td",xo,a);b.textContent="--",o.push(b)}return[a,o]}let pt=new Map;function Qe(l,i,o){let a=pt.get(i)||{},h=B.bind[l](s,i,o);h&&(Ct(l,i,a[l]=h),pt.set(i,a))}function ne(l,i,o){let a=pt.get(i)||{};for(let h in a)(l==null||h==l)&&(In(h,i,a[h]),delete a[h]);l==null&&pt.delete(i)}let Ne=0,qe=0,G=0,j=0,pe=0,_e=0,ye=0,He=0,tt=0,yt=0;s.bbox={};let an=!1,kl=!1,Ft=!1,Xt=!1,it=!1;function un(l,i,o){(o||l!=s.width||i!=s.height)&&rs(l,i),ll(!1),Ft=!0,kl=!0,Xt=it=B.left>=0,kt()}function rs(l,i){s.width=Ne=G=l,s.height=qe=j=i,pe=_e=0,kr(),xr();let o=s.bbox;ye=o.left=Mt(pe*te,.5),He=o.top=Mt(_e*te,.5),tt=o.width=Mt(G*te,.5),yt=o.height=Mt(j*te,.5)}let _r=3;function yr(){let l=!1,i=0;for(;!l;){i++;let o=zr(i),a=Vr(i);l=i==_r||o&&a,l||(rs(s.width,s.height),kl=!0)}}function br({width:l,height:i}){un(l,i)}s.setSize=br;function kr(){let l=!1,i=!1,o=!1,a=!1;C.forEach((h,p)=>{if(h.show&&h._show){let{side:S,_size:b}=h,T=S%2,V=h.label!=null?h.labelSize:0,x=b+V;x>0&&(T?(G-=x,S==3?(pe+=x,a=!0):o=!0):(j-=x,S==0?(_e+=x,l=!0):i=!0))}}),bt[0]=l,bt[1]=o,bt[2]=i,bt[3]=a,G-=mt[1]+mt[3],pe+=mt[3],j-=mt[2]+mt[0],_e+=mt[0]}function xr(){let l=pe+G,i=_e+j,o=pe,a=_e;function h(p,S){switch(p){case 1:return l+=S,l-S;case 2:return i+=S,i-S;case 3:return o-=S,o+S;case 0:return a-=S,a+S}}C.forEach((p,S)=>{if(p.show&&p._show){let b=p.side;p._pos=h(b,p._size),p.label!=null&&(p._lpos=h(b,p.labelSize))}})}let B=s.cursor=we({},ya,{drag:{y:r==2}},e.cursor);{B.idxs=H,B._lock=!1;let l=B.points;l.show=ee(l.show),l.size=ee(l.size),l.stroke=ee(l.stroke),l.width=ee(l.width),l.fill=ee(l.fill)}let xl=s.focus=we({},e.focus||{alpha:.3},B.focus),Ml=xl.prox>=0,Ie=[null];function Mr(l,i){if(i>0){let o=B.points.show(s,i);if(o)return $e(o,wo),$e(o,l.class),Gt(o,-10,-10,G,j),M.insertBefore(o,Ie[i]),o}}function os(l,i){if(r==1||i>0){let o=r==1&&D[l.scale].time,a=l.value;l.value=o?si(a)?hi(X,fi(a,O)):a||Fe:a||Ra,l.label=l.label||(o?xa:ka)}if(i>0){l.width=l.width==null?1:l.width,l.paths=l.paths||$a||Oo,l.fillTo=ee(l.fillTo||Oa),l.pxAlign=+le(l.pxAlign,L),l.pxRound=vi(l.pxAlign),l.stroke=ee(l.stroke||null),l.fill=ee(l.fill||null),l._stroke=l._fill=l._paths=l._focus=null;let o=Wi(l.width,1),a=l.points=we({},{size:o,width:Le(1,o*.2),stroke:l.stroke,space:o*2,paths:Ka,_stroke:null,_fill:null},l.points);a.show=ee(a.show),a.filter=ee(a.filter),a.fill=ee(a.fill),a.stroke=ee(a.stroke),a.paths=ee(a.paths),a.pxAlign=l.pxAlign}if(De){let o=bl(l,i);st.splice(i,0,o[0]),ht.splice(i,0,o[1]),I.values.push(null)}if(B.show){H.splice(i,0,null);let o=Mr(l,i);o&&Ie.splice(i,0,o)}Pe("addSeries",i)}function Tr(l,i){i=i??v.length,l=Qi(l,i,pi,wi),v.splice(i,0,l),os(v[i],i)}s.addSeries=Tr;function Dr(l){if(v.splice(l,1),De){I.values.splice(l,1),ht.splice(l,1);let i=st.splice(l,1)[0];ne(null,i.firstChild),i.remove()}B.show&&(H.splice(l,1),Ie.length>1&&Ie.splice(l,1)[0].remove()),Pe("delSeries",l)}s.delSeries=Dr;let bt=[!1,!1,!1,!1];function Cr(l,i){if(l._show=l.show,l.show){let o=l.side%2,a=D[l.scale];a==null&&(l.scale=o?v[1].scale:A,a=D[l.scale]);let h=a.time;l.size=ee(l.size),l.space=ee(l.space),l.rotate=ee(l.rotate),l.incrs=ee(l.incrs||(a.distr==2?ta:h?E==1?sa:oa:la)),l.splits=ee(l.splits||(h&&a.distr==1?Re:a.distr==3?Wn:a.distr==4?Da:Ta)),l.stroke=ee(l.stroke),l.grid.stroke=ee(l.grid.stroke),l.ticks.stroke=ee(l.ticks.stroke),l.border.stroke=ee(l.border.stroke);let p=l.values;l.values=Dt(p)&&!Dt(p[0])?ee(p):h?Dt(p)?ci(X,ui(p,O)):si(p)?ca(X,p):p||Te:p||Ma,l.filter=ee(l.filter||(a.distr>=3?La:Mi)),l.font=bi(l.font),l.labelFont=bi(l.labelFont),l._size=l.size(s,null,i,0),l._space=l._rotate=l._incrs=l._found=l._splits=l._values=null,l._size>0&&(bt[i]=!0,l._el=et(ho,w))}}function el(l,i,o,a){let[h,p,S,b]=o,T=i%2,V=0;return T==0&&(b||p)&&(V=i==0&&!h||i==2&&!S?Me(di.size/3):0),T==1&&(h||S)&&(V=i==1&&!p||i==3&&!b?Me(mi.size/2):0),V}let as=s.padding=(e.padding||[el,el,el,el]).map(l=>ee(le(l,el))),mt=s._padding=as.map((l,i)=>l(s,i,bt,0)),be,Ce=null,Ee=null,Tl=r==1?v[0].idxs:null,lt=null,Dl=!1;function us(l,i){if(t=l==null?[]:At(l,ii),r==2){be=0;for(let o=1;o=0,it=!0,kt()}}s.setData=us;function cn(){Dl=!0;let l,i;r==1&&(be>0?(Ce=Tl[0]=0,Ee=Tl[1]=be-1,l=t[0][Ce],i=t[0][Ee],U==2?(l=Ce,i=Ee):be==1&&(U==3?[l,i]=$l(l,l,P.log,!1):U==4?[l,i]=qn(l,l,P.log,!1):P.time?i=l+Me(86400/E):[l,i]=Gl(l,i,Un,!0))):(Ce=Tl[0]=l=null,Ee=Tl[1]=i=null)),Ot(A,l,i)}let Cl,Nt,fn,hn,dn,pn,mn,gn,wn,tl;function cs(l=Ws,i,o=Di,a="butt",h=Ws,p="round"){l!=Cl&&(u.strokeStyle=Cl=l),h!=Nt&&(u.fillStyle=Nt=h),i!=fn&&(u.lineWidth=fn=i),p!=dn&&(u.lineJoin=dn=p),a!=pn&&(u.lineCap=pn=a),o!=hn&&u.setLineDash(hn=o)}function fs(l,i,o,a){i!=Nt&&(u.fillStyle=Nt=i),l!=mn&&(u.font=mn=l),o!=gn&&(u.textAlign=gn=o),a!=wn&&(u.textBaseline=wn=a)}function Sn(l,i,o,a,h=0){if(a.length>0&&l.auto(s,Dl)&&(i==null||i.min==null)){let p=le(Ce,0),S=le(Ee,a.length-1),b=o.min==null?l.distr==3?Ao(a,p,S):Po(a,p,S,h):[o.min,o.max];l.min=Ge(l.min,o.min=b[0]),l.max=Le(l.max,o.max=b[1])}}function Er(){let l=At(D,ii);for(let a in l){let h=l[a],p=F[a];if(p!=null&&p.min!=null)we(h,p),a==A&&ll(!0);else if(a!=A||r==2)if(be==0&&h.from==null){let S=h.range(s,null,null,a);h.min=S[0],h.max=S[1]}else h.min=Q,h.max=-Q}if(be>0){v.forEach((a,h)=>{if(r==1){let p=a.scale,S=l[p],b=F[p];if(h==0){let T=S.range(s,S.min,S.max,p);S.min=T[0],S.max=T[1],Ce=vt(S.min,t[0]),Ee=vt(S.max,t[0]),t[0][Ce]S.max&&Ee--,a.min=lt[Ce],a.max=lt[Ee]}else a.show&&a.auto&&Sn(S,b,a,t[h],a.sorted);a.idxs[0]=Ce,a.idxs[1]=Ee}else if(h>0&&a.show&&a.auto){let[p,S]=a.facets,b=p.scale,T=S.scale,[V,x]=t[h];Sn(l[b],F[b],p,V,p.sorted),Sn(l[T],F[T],S,x,S.sorted),a.min=S.min,a.max=S.max}});for(let a in l){let h=l[a],p=F[a];if(h.from==null&&(p==null||p.min==null)){let S=h.range(s,h.min==Q?null:h.min,h.max==-Q?null:h.max,a);h.min=S[0],h.max=S[1]}}}for(let a in l){let h=l[a];if(h.from!=null){let p=l[h.from];if(p.min==null)h.min=h.max=null;else{let S=h.range(s,p.min,p.max,a);h.min=S[0],h.max=S[1]}}}let i={},o=!1;for(let a in l){let h=l[a],p=D[a];if(p.min!=h.min||p.max!=h.max){p.min=h.min,p.max=h.max;let S=p.distr;p._min=S==3?Et(p.min):S==4?Rn(p.min,p.asinh):p.min,p._max=S==3?Et(p.max):S==4?Rn(p.max,p.asinh):p.max,i[a]=o=!0}}if(o){v.forEach((a,h)=>{r==2?h>0&&i.y&&(a._paths=null):i[a.scale]&&(a._paths=null)});for(let a in i)Ft=!0,Pe("setScale",a);B.show&&(Xt=it=B.left>=0)}for(let a in F)F[a]=null}function Pr(l){let i=ti(Ce-1,0,be-1),o=ti(Ee+1,0,be-1);for(;l[i]==null&&i>0;)i--;for(;l[o]==null&&o0&&(v.forEach((l,i)=>{if(i>0&&l.show&&l._paths==null){let o=Pr(t[i]);l._paths=l.paths(s,i,o[0],o[1])}}),v.forEach((l,i)=>{if(i>0&&l.show){tl!=l.alpha&&(u.globalAlpha=tl=l.alpha),hs(i,!1),l._paths&&ds(i,!1);{hs(i,!0);let o=l.points.show(s,i,Ce,Ee),a=l.points.filter(s,i,o,l._paths?l._paths.gaps:null);(o||a)&&(l.points._paths=l.points.paths(s,i,Ce,Ee,a),ds(i,!0))}tl!=1&&(u.globalAlpha=tl=1),Pe("drawSeries",i)}}))}function hs(l,i){let o=i?v[l].points:v[l];o._stroke=o.stroke(s,l),o._fill=o.fill(s,l)}function ds(l,i){let o=i?v[l].points:v[l],a=o._stroke,h=o._fill,{stroke:p,fill:S,clip:b,flags:T}=o._paths,V=null,x=oe(o.width*te,3),z=x%2/2;i&&h==null&&(h=x>0?"#fff":a);let q=o.pxAlign==1;if(q&&u.translate(z,z),!i){let me=ye,K=He,ae=tt,J=yt,se=x*te/2;o.min==0&&(J+=se),o.max==0&&(K-=se,J+=se),V=new Path2D,V.rect(me,K,ae,J)}i?vn(a,x,o.dash,o.cap,h,p,S,T,b):Lr(l,a,x,o.dash,o.cap,h,p,S,T,V,b),q&&u.translate(-z,-z)}function Lr(l,i,o,a,h,p,S,b,T,V,x){let z=!1;R.forEach((q,me)=>{if(q.series[0]==l){let K=v[q.series[1]],ae=t[q.series[1]],J=(K._paths||Sl).band;Dt(J)&&(J=q.dir==1?J[0]:J[1]);let se,ge=null;K.show&&J&&Ro(ae,Ce,Ee)?(ge=q.fill(s,me)||p,se=K._paths.clip):J=null,vn(i,o,a,h,ge,S,b,T,V,x,se,J),z=!0}}),z||vn(i,o,a,h,p,S,b,T,V,x)}let ps=Lt|Ul;function vn(l,i,o,a,h,p,S,b,T,V,x,z){cs(l,i,o,a,h),(T||V||z)&&(u.save(),T&&u.clip(T),V&&u.clip(V)),z?(b&ps)==ps?(u.clip(z),x&&u.clip(x),Pl(h,S),El(l,p,i)):b&Ul?(Pl(h,S),u.clip(z),El(l,p,i)):b&Lt&&(u.save(),u.clip(z),x&&u.clip(x),Pl(h,S),u.restore(),El(l,p,i)):(Pl(h,S),El(l,p,i)),(T||V||z)&&u.restore()}function El(l,i,o){o>0&&(i instanceof Map?i.forEach((a,h)=>{u.strokeStyle=Cl=h,u.stroke(a)}):i!=null&&l&&u.stroke(i))}function Pl(l,i){i instanceof Map?i.forEach((o,a)=>{u.fillStyle=Nt=a,u.fill(o)}):i!=null&&l&&u.fill(i)}function Rr(l,i,o,a){let h=C[l],p;if(a<=0)p=[0,0];else{let S=h._space=h.space(s,l,i,o,a),b=h._incrs=h.incrs(s,l,i,o,a,S);p=eu(i,o,b,a,S)}return h._found=p}function _n(l,i,o,a,h,p,S,b,T,V){let x=S%2/2;L==1&&u.translate(x,x),cs(b,S,T,V,b),u.beginPath();let z,q,me,K,ae=h+(a==0||a==3?-p:p);o==0?(q=h,K=ae):(z=h,me=ae);for(let J=0;J{if(!o.show)return;let h=D[o.scale];if(h.min==null){o._show&&(i=!1,o._show=!1,ll(!1));return}else o._show||(i=!1,o._show=!0,ll(!1));let p=o.side,S=p%2,{min:b,max:T}=h,[V,x]=Rr(a,b,T,S==0?G:j);if(x==0)return;let z=h.distr==2,q=o._splits=o.splits(s,a,b,T,V,x,z),me=h.distr==2?q.map(se=>lt[se]):q,K=h.distr==2?lt[q[1]]-lt[q[0]]:V,ae=o._values=o.values(s,o.filter(s,me,a,x,K),a,x,K);o._rotate=p==2?o.rotate(s,ae,a,x):0;let J=o._size;o._size=Kn(o.size(s,ae,a,l)),J!=null&&o._size!=J&&(i=!1)}),i}function Vr(l){let i=!0;return as.forEach((o,a)=>{let h=o(s,a,bt,l);h!=mt[a]&&(i=!1),mt[a]=h}),i}function Fr(){for(let l=0;llt[nt]):K,J=x.distr==2?lt[K[1]]-lt[K[0]]:T,se=i.ticks,ge=i.border,We=se.show?Me(se.size*te):0,ue=i._rotate*-Bl/180,Ve=N(i._pos*te),Be=(We+me)*b,Oe=Ve+Be;p=a==0?Oe:0,h=a==1?Oe:0;let Ue=i.font[0],wt=i.align==1?Yt:i.align==2?Pn:ue>0?Yt:ue<0?Pn:a==0?"center":o==3?Pn:Yt,St=ue||a==1?"middle":o==2?hl:Is;fs(Ue,S,wt,St);let Es=i.font[1]*ba,Nl=K.map(nt=>N(d(nt,x,z,q))),Ps=i._values;for(let nt=0;nt{o>0&&(i._paths=null,l&&(r==1?(i.min=null,i.max=null):i.facets.forEach(a=>{a.min=null,a.max=null})))})}let yn=!1;function kt(){yn||(Uo(Nr),yn=!0)}function Nr(){an&&(Er(),an=!1),Ft&&(yr(),Ft=!1),kl&&(ce(k,Yt,pe),ce(k,hl,_e),ce(k,pl,G),ce(k,ml,j),ce(M,Yt,pe),ce(M,hl,_e),ce(M,pl,G),ce(M,ml,j),ce(w,pl,Ne),ce(w,ml,qe),y.width=Me(Ne*te),y.height=Me(qe*te),C.forEach(({_el:l,_show:i,_size:o,_pos:a,side:h})=>{if(l!=null)if(i){let p=h===3||h===0?o:0,S=h%2==1;ce(l,S?"left":"top",a-p),ce(l,S?"width":"height",o),ce(l,S?"top":"left",S?_e:pe),ce(l,S?"height":"width",S?j:G),Hn(l,Tt)}else $e(l,Tt)}),Cl=Nt=fn=dn=pn=mn=gn=wn=hn=null,tl=1,Vl(!0),Pe("setSize"),kl=!1),Ne>0&&qe>0&&(u.clearRect(0,0,y.width,y.height),Pe("drawClear"),Y.forEach(l=>l()),Pe("draw")),B.show&&Xt&&(gt(null,!0,!1),Xt=!1),g||(g=!0,s.status=1,Pe("ready")),Dl=!1,yn=!1}s.redraw=(l,i)=>{Ft=i||!1,l!==!1?Ot(A,P.min,P.max):kt()};function bn(l,i){let o=D[l];if(o.from==null){if(be==0){let a=o.range(s,i.min,i.max,l);i.min=a[0],i.max=a[1]}if(i.min>i.max){let a=i.min;i.min=i.max,i.max=a}if(be>1&&i.min!=null&&i.max!=null&&i.max-i.min<1e-16)return;l==A&&o.distr==2&&be>0&&(i.min=vt(i.min,t[0]),i.max=vt(i.max,t[0]),i.min==i.max&&i.max++),F[l]=i,an=!0,kt()}}s.setScale=bn;let kn,xn,Al,Ll,ms,gs,nl,sl,ws,Ss,fe,he,xt=!1,ze=B.drag,ke=ze.x,xe=ze.y;B.show&&(B.x&&(kn=et(mo,M)),B.y&&(xn=et(go,M)),P.ori==0?(Al=kn,Ll=xn):(Al=xn,Ll=kn),fe=B.left,he=B.top);let Xe=s.select=we({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),il=Xe.show?et(po,Xe.over?M:k):null;function Rl(l,i){if(Xe.show){for(let o in l)ce(il,o,Xe[o]=l[o]);i!==!1&&Pe("setSelect")}}s.setSelect=Rl;function Or(l,i){let o=v[l],a=De?st[l]:null;o.show?a&&Hn(a,Tt):(a&&$e(a,Tt),Ie.length>1&&Gt(Ie[l],-10,-10,G,j))}function Ot(l,i,o){bn(l,{min:i,max:o})}function rt(l,i,o,a){i.focus!=null&&Yr(l),i.show!=null&&v.forEach((h,p)=>{p>0&&(l==p||l==null)&&(h.show=i.show,Or(p,i.show),Ot(r==2?h.facets[1].scale:h.scale,null,null),kt())}),o!==!1&&Pe("setSeries",l,i),a&&cl("setSeries",s,l,i)}s.setSeries=rt;function Hr(l,i){we(R[l],i)}function Ir(l,i){l.fill=ee(l.fill||null),l.dir=le(l.dir,-1),i=i??R.length,R.splice(i,0,l)}function Wr(l){l==null?R.length=0:R.splice(l,1)}s.addBand=Ir,s.setBand=Hr,s.delBand=Wr;function Br(l,i){v[l].alpha=i,B.show&&Ie[l]&&(Ie[l].style.opacity=i),De&&st[l]&&(st[l].style.opacity=i)}let rl,zl,ol,Ht={focus:!0};function Yr(l){if(l!=ol){let i=l==null,o=xl.alpha!=1;v.forEach((a,h)=>{let p=i||h==0||h==l;a._focus=i?null:p,o&&Br(h,p?1:xl.alpha)}),ol=l,o&&kt()}}De&&Ml&&Ct(qs,Je,l=>{B._lock||ol!=null&&rt(null,Ht,!0,Ae.setSeries)});function at(l,i,o){let a=D[i];o&&(l=l/te-(a.ori==1?_e:pe));let h=G;a.ori==1&&(h=j,l=h-l),a.dir==-1&&(l=h-l);let p=a._min,S=a._max,b=l/h,T=p+(S-p)*b,V=a.distr;return V==3?_t(10,T):V==4?Fo(T,a.asinh):T}function Gr(l,i){let o=at(l,A,i);return vt(o,t[0],Ce,Ee)}s.valToIdx=l=>vt(l,t[0]),s.posToIdx=Gr,s.posToVal=at,s.valToPos=(l,i,o)=>D[i].ori==0?c(l,D[i],o?tt:G,o?ye:0):m(l,D[i],o?yt:j,o?He:0);function qr(l){l(s),kt()}s.batch=qr,s.setCursor=(l,i,o)=>{fe=l.left,he=l.top,gt(null,i,o)};function vs(l,i){ce(il,Yt,Xe.left=l),ce(il,pl,Xe.width=i)}function _s(l,i){ce(il,hl,Xe.top=l),ce(il,ml,Xe.height=i)}let al=P.ori==0?vs:_s,ul=P.ori==1?vs:_s;function Ur(){if(De&&I.live)for(let l=r==2?1:0;l{(h>0||!Ze)&&bs(h,o)})}De&&I.live&&Ur(),it=!1,i!==!1&&Pe("setLegend")}s.setLegend=ys;function bs(l,i){let o;if(i==null)o=ot;else{let a=v[l],h=l==0&&U==2?lt:t[l];o=Ze?a.values(s,l,i):{_:a.value(s,h[i],l,i)}}I.values[l]=o}function gt(l,i,o){ws=fe,Ss=he,[fe,he]=B.move(s,fe,he),B.show&&(Al&&Gt(Al,Me(fe),0,G,j),Ll&&Gt(Ll,0,Me(he),G,j));let a,h=Ce>Ee;rl=Q;let p=P.ori==0?G:j,S=P.ori==1?G:j;if(fe<0||be==0||h){a=null;for(let b=0;b0&&Ie.length>1&&Gt(Ie[b],-10,-10,G,j);if(Ml&&rt(null,Ht,!0,l==null&&Ae.setSeries),I.live){H.fill(null),it=!0;for(let b=0;b0&&z.show){let se=ae==null?-10:Pt(Z(ae,r==1?D[z.scale]:D[z.facets[1].scale],S,0),.5);if(se>0&&r==1){let ue=Ye(se-he);ue<=rl&&(rl=ue,zl=x)}let ge,We;if(P.ori==0?(ge=J,We=se):(ge=se,We=J),it&&Ie.length>1){Co(Ie[x],B.points.fill(s,x),B.points.stroke(s,x));let ue,Ve,Be,Oe,Ue=!0,wt=B.points.bbox;if(wt!=null){Ue=!1;let St=wt(s,x);Be=St.left,Oe=St.top,ue=St.width,Ve=St.height}else Be=ge,Oe=We,ue=Ve=B.points.size(s,x);Eo(Ie[x],ue,Ve,Ue),Gt(Ie[x],Be,Oe,G,j)}}if(I.live){if(!it||x==0&&Ze)continue;bs(x,K)}}}if(B.idx=a,B.left=fe,B.top=he,it&&(I.idx=a,ys()),Xe.show&&xt)if(l!=null){let[b,T]=Ae.scales,[V,x]=Ae.match,[z,q]=l.cursor.sync.scales,me=l.cursor.drag;if(ke=me._x,xe=me._y,ke||xe){let{left:K,top:ae,width:J,height:se}=l.select,ge=l.scales[b].ori,We=l.posToVal,ue,Ve,Be,Oe,Ue,wt=b!=null&&V(b,z),St=T!=null&&x(T,q);wt&&ke?(ge==0?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[b],Oe=re(We(ue,z),Be,p,0),Ue=re(We(ue+Ve,z),Be,p,0),al(Ge(Oe,Ue),Ye(Ue-Oe))):al(0,p),St&&xe?(ge==1?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[T],Oe=Z(We(ue,q),Be,S,0),Ue=Z(We(ue+Ve,q),Be,S,0),ul(Ge(Oe,Ue),Ye(Ue-Oe))):ul(0,S)}else Tn()}else{let b=Ye(ws-ms),T=Ye(Ss-gs);if(P.ori==1){let q=b;b=T,T=q}ke=ze.x&&b>=ze.dist,xe=ze.y&&T>=ze.dist;let V=ze.uni;V!=null?ke&&xe&&(ke=b>=V,xe=T>=V,!ke&&!xe&&(T>b?xe=!0:ke=!0)):ze.x&&ze.y&&(ke||xe)&&(ke=xe=!0);let x,z;ke&&(P.ori==0?(x=nl,z=fe):(x=sl,z=he),al(Ge(x,z),Ye(z-x)),xe||ul(0,S)),xe&&(P.ori==1?(x=nl,z=fe):(x=sl,z=he),ul(Ge(x,z),Ye(z-x)),ke||al(0,p)),!ke&&!xe&&(al(0,0),ul(0,0))}if(ze._x=ke,ze._y=xe,l==null){if(o){if(Cs!=null){let[b,T]=Ae.scales;Ae.values[0]=b!=null?at(P.ori==0?fe:he,b):null,Ae.values[1]=T!=null?at(P.ori==1?fe:he,T):null}cl(Bs,s,fe,he,G,j,a)}if(Ml){let b=o&&Ae.setSeries,T=xl.prox;ol==null?rl<=T&&rt(zl,Ht,!0,b):rl>T?rt(null,Ht,!0,b):zl!=ol&&rt(zl,Ht,!0,b)}}g&&i!==!1&&Pe("setCursor")}let It=null;function Vl(l){l===!0?It=null:(It=M.getBoundingClientRect(),Pe("syncRect",It))}function ks(l,i,o,a,h,p,S){B._lock||(Mn(l,i,o,a,h,p,S,!1,l!=null),l!=null?gt(null,!0,!0):gt(i,!0,!1))}function Mn(l,i,o,a,h,p,S,b,T){if(It==null&&Vl(!1),l!=null)o=l.clientX-It.left,a=l.clientY-It.top;else{if(o<0||a<0){fe=-10,he=-10;return}let[V,x]=Ae.scales,z=i.cursor.sync,[q,me]=z.values,[K,ae]=z.scales,[J,se]=Ae.match,ge=i.axes[0].side%2==1,We=P.ori==0?G:j,ue=P.ori==1?G:j,Ve=ge?p:h,Be=ge?h:p,Oe=ge?a:o,Ue=ge?o:a;if(K!=null?o=J(V,K)?d(q,D[V],We,0):-10:o=We*(Oe/Ve),ae!=null?a=se(x,ae)?d(me,D[x],ue,0):-10:a=ue*(Ue/Be),P.ori==1){let wt=o;o=a,a=wt}}T&&((o<=1||o>=G-1)&&(o=Mt(o,G)),(a<=1||a>=j-1)&&(a=Mt(a,j))),b?(ms=o,gs=a,[nl,sl]=B.move(s,o,a)):(fe=o,he=a)}let $r={width:0,height:0};function Tn(){Rl($r,!1)}function xs(l,i,o,a,h,p,S){xt=!0,ke=xe=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!0,!1),l!=null&&(Qe(An,Nn,Ms),cl(Ys,s,nl,sl,G,j,null))}function Ms(l,i,o,a,h,p,S){xt=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!1,!0);let{left:b,top:T,width:V,height:x}=Xe,z=V>0||x>0;if(z&&Rl(Xe),ze.setScale&&z){let q=b,me=V,K=T,ae=x;if(P.ori==1&&(q=T,me=x,K=b,ae=V),ke&&Ot(A,at(q,A),at(q+me,A)),xe)for(let J in D){let se=D[J];J!=A&&se.from==null&&se.min!=Q&&Ot(J,at(K+ae,J),at(K,J))}Tn()}else B.lock&&(B._lock=!B._lock,B._lock||gt(null,!0,!1));l!=null&&(ne(An,Nn),cl(An,s,fe,he,G,j,null))}function Kr(l,i,o,a,h,p,S){if(!B._lock){let b=xt;if(xt){let T=!0,V=!0,x=10,z,q;P.ori==0?(z=ke,q=xe):(z=xe,q=ke),z&&q&&(T=fe<=x||fe>=G-x,V=he<=x||he>=j-x),z&&T&&(fe=fe{rt(o,a,!0,!1)},B.show&&(Qe(Ys,M,xs),Qe(Bs,M,ks),Qe(Gs,M,Vl),Qe(qs,M,Kr),Qe(Us,M,Ts),Bn.add(s),s.syncRect=Vl);let Fl=s.hooks=e.hooks||{};function Pe(l,i,o){l in Fl&&Fl[l].forEach(a=>{a.call(null,s,i,o)})}(e.plugins||[]).forEach(l=>{for(let i in l.hooks)Fl[i]=(Fl[i]||[]).concat(l.hooks[i])});let Ae=we({key:null,setSeries:!1,filters:{pub:li,sub:li},scales:[A,v[1]?v[1].scale:null],match:[ni,ni],values:[null,null]},B.sync);B.sync=Ae;let Cs=Ae.key,Dn=Yi(Cs);function cl(l,i,o,a,h,p,S){Ae.filters.pub(l,i,o,a,h,p,S)&&Dn.pub(l,i,o,a,h,p,S)}Dn.sub(s);function jr(l,i,o,a,h,p,S){Ae.filters.sub(l,i,o,a,h,p,S)&&Wt[l](null,i,o,a,h,p,S)}s.pub=jr;function Jr(){Dn.unsub(s),Bn.delete(s),pt.clear(),In(Yl,Ut,Ds),_.remove(),Pe("destroy")}s.destroy=Jr;function Cn(){Pe("init",e,t),us(t||e.data,!1),F[A]?bn(A,F[A]):cn(),un(e.width,e.height),gt(null,!0,!1),Rl(Xe,!1)}return v.forEach(os),C.forEach(Cr),n?n instanceof HTMLElement?(n.appendChild(_),Cn()):n(s,Cn):Cn(),s}Se.assign=we;Se.fmtNum=$n;Se.rangeNum=Gl;Se.rangeLog=$l;Se.rangeAsinh=qn;Se.orient=Rt;Se.pxRatio=te;Se.join=qo;Se.fmtDate=jn,Se.tzDate=Xo;Se.sync=Yi;{Se.addGap=Ha,Se.clipGaps=Zl;let e=Se.paths={points:ji};e.linear=Zi,e.stepped=Ba,e.bars=Ya,e.spline=qa}var lu=(e,t,n)=>su(e-t,n)+t,nu=(e,t)=>e-t;function su(e,t){return Math.floor(e/t)*t}function iu(e,t){let n=[...e.values()];t&&n.sort((f,c)=>t(f.value,c.value));let s=Array(n.length),r=Array(n.length);for(let f=0;f+e,tn=class{constructor(t,n){this.chart=t,this.datasets=new Map,this.options=n,this.bucketSize=lr(n),this.histOffset=0}handleMeasurements(t){t.forEach(({y:n})=>{if(n==null)return;n=lu(n,this.histOffset,this.bucketSize);let s=this.datasets.get(n);s?s.count++:this.datasets.set(n,{value:n,count:1})}),this.chart.setData(iu(this.datasets,nu))}static initialData(){return[[],[]]}static getConfig(t){let n=lr(t),s=Se.paths.bars({align:1,size:[1,1/0],gap:4});return{title:t.title,width:t.width,height:t.height,scales:{x:{time:!1,auto:!1,dir:1,range:r=>[r.data[0][0],r.data[0][r.data[0].length-1]+n]}},axes:[{incrs:()=>[0,1,2,3,4,5,6,7,8,9,10].map(r=>r*n),splits:(r,f,c,m,d,g)=>{let _=r.axes[f]._space,y=r.valToPos(r.data[0][0]+n,"x")-r.valToPos(r.data[0][0],"x"),u=r.data[0][0],w=r.data[0][r.data[0].length-1]+n,k=[],M=Math.ceil(_/y);for(let L=0,N=u;N<=w;L++,N+=n)!(L%M)&&k.push(N);return k}}],series:[{label:t.label,value:(r,f)=>f+`-${f+n} ${t.unit}`},{paths:s,points:{show:!1},...Ol.at(1),width:2,label:"Events"}]}}};var ru=e=>e.unit?{value:(t,n)=>n==null?"--":n.toFixed(3)+` ${e.unit}`}:{},sr=e=>({value:"{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}"}),ou=e=>e.unit?{values:(t,n,s)=>n.map(r=>+r.toFixed(2)+` ${e.unit}`)}:{},ir=e=>({space:55,values:[[3600*24*365,"{YYYY}",null,null,null,null,null,null,1],[3600*24*28,"{MMM}",` +(()=>{var Zr=Object.create;var Rs=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var Xr=Object.getOwnPropertyNames;var eo=Object.getPrototypeOf,to=Object.prototype.hasOwnProperty;var lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var no=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Xr(t))!to.call(e,r)&&r!==n&&Rs(e,r,{get:()=>t[r],enumerable:!(s=Qr(t,r))||s.enumerable});return e};var so=(e,t,n)=>(n=e!=null?Zr(eo(e)):{},no(t||!e||!e.__esModule?Rs(n,"default",{value:e,enumerable:!0}):n,e));var Vs=lo((En,zs)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof En=="object"?zs.exports=t():e.NProgress=t()})(En,function(){var e={};e.version="0.2.0";var t=e.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};e.configure=function(u){var w,x;for(w in u)x=u[w],x!==void 0&&u.hasOwnProperty(w)&&(t[w]=x);return this},e.status=null,e.set=function(u){var w=e.isStarted();u=n(u,t.minimum,1),e.status=u===1?null:u;var x=e.render(!w),M=x.querySelector(t.barSelector),L=t.speed,N=t.easing;return x.offsetWidth,f(function(E){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),c(M,r(u,L,N)),u===1?(c(x,{transition:"none",opacity:1}),x.offsetWidth,setTimeout(function(){c(x,{transition:"all "+L+"ms linear",opacity:0}),setTimeout(function(){e.remove(),E()},L)},L)):setTimeout(E,L)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var u=function(){setTimeout(function(){!e.status||(e.trickle(),u())},t.trickleSpeed)};return t.trickle&&u(),this},e.done=function(u){return!u&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(u){var w=e.status;return w?(typeof u!="number"&&(u=(1-w)*n(Math.random()*w,.1,.95)),w=n(w+u,0,.994),e.set(w)):e.start()},e.trickle=function(){return e.inc(Math.random()*t.trickleRate)},function(){var u=0,w=0;e.promise=function(x){return!x||x.state()==="resolved"?this:(w===0&&e.start(),u++,w++,x.always(function(){w--,w===0?(u=0,e.done()):e.set((u-w)/u)}),this)}}(),e.render=function(u){if(e.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");var w=document.createElement("div");w.id="nprogress",w.innerHTML=t.template;var x=w.querySelector(t.barSelector),M=u?"-100":s(e.status||0),L=document.querySelector(t.parent),N;return c(x,{transition:"all 0 linear",transform:"translate3d("+M+"%,0,0)"}),t.showSpinner||(N=w.querySelector(t.spinnerSelector),N&&y(N)),L!=document.body&&d(L,"nprogress-custom-parent"),L.appendChild(w),w},e.remove=function(){g(document.documentElement,"nprogress-busy"),g(document.querySelector(t.parent),"nprogress-custom-parent");var u=document.getElementById("nprogress");u&&y(u)},e.isRendered=function(){return!!document.getElementById("nprogress")},e.getPositioningCSS=function(){var u=document.body.style,w="WebkitTransform"in u?"Webkit":"MozTransform"in u?"Moz":"msTransform"in u?"ms":"OTransform"in u?"O":"";return w+"Perspective"in u?"translate3d":w+"Transform"in u?"translate":"margin"};function n(u,w,x){return ux?x:u}function s(u){return(-1+u)*100}function r(u,w,x){var M;return t.positionUsing==="translate3d"?M={transform:"translate3d("+s(u)+"%,0,0)"}:t.positionUsing==="translate"?M={transform:"translate("+s(u)+"%,0)"}:M={"margin-left":s(u)+"%"},M.transition="all "+w+"ms "+x,M}var f=function(){var u=[];function w(){var x=u.shift();x&&x(w)}return function(x){u.push(x),u.length==1&&w()}}(),c=function(){var u=["Webkit","O","Moz","ms"],w={};function x(E){return E.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(v,C){return C.toUpperCase()})}function M(E){var v=document.body.style;if(E in v)return E;for(var C=u.length,D=E.charAt(0).toUpperCase()+E.slice(1),R;C--;)if(R=u[C]+D,R in v)return R;return E}function L(E){return E=x(E),w[E]||(w[E]=M(E))}function N(E,v,C){v=L(v),E.style[v]=C}return function(E,v){var C=arguments,D,R;if(C.length==2)for(D in v)R=v[D],R!==void 0&&v.hasOwnProperty(D)&&N(E,D,R);else N(E,C[1],C[2])}}();function m(u,w){var x=typeof u=="string"?u:_(u);return x.indexOf(" "+w+" ")>=0}function d(u,w){var x=_(u),M=x+w;m(x,w)||(u.className=M.substring(1))}function g(u,w){var x=_(u),M;!m(u,w)||(M=x.replace(" "+w+" "," "),u.className=M.substring(1,M.length-1))}function _(u){return(" "+(u.className||"")+" ").replace(/\s+/gi," ")}function y(u){u&&u.parentNode&&u.parentNode.removeChild(u)}return e})});var ss=so(Vs());var Ns={phoenix:[242,110,64],elixir:[75,68,115],red:[255,99,132],orange:[255,159,64],yellow:[255,205,86],green:[75,192,192],blue:[54,162,253],purple:[153,102,255],grey:[201,203,207]},Fs=Object.keys(Ns),Os={at:e=>{let[t,n,s]=Os.rgb(e);return`rgb(${t}, ${n}, ${s})`},rgb:e=>Ns[Fs[e%Fs.length]]},Ol={at:e=>{let[t,n,s]=Os.rgb(e);return{stroke:`rgb(${t}, ${n}, ${s})`,fill:`rgb(${t}, ${n}, ${s}, 0.1)`}}};var ve="u-",io="uplot",ro=ve+"hz",oo=ve+"vt",ao=ve+"title",uo=ve+"wrap",co=ve+"under",fo=ve+"over",ho=ve+"axis",Tt=ve+"off",po=ve+"select",mo=ve+"cursor-x",go=ve+"cursor-y",wo=ve+"cursor-pt",So=ve+"legend",vo=ve+"live",_o=ve+"inline",yo=ve+"thead",bo=ve+"series",xo=ve+"marker",Hs=ve+"label",ko=ve+"value",pl="width",ml="height",hl="top",Is="bottom",Yt="left",Pn="right",Yn="#000",Ws=Yn+"0",Bs="mousemove",Ys="mousedown",An="mouseup",Gs="mouseenter",qs="mouseleave",Us="dblclick",Mo="resize",To="scroll",$s="change",Yl="dppxchange",jt=typeof window<"u",Nn=jt?document:null,Ut=jt?window:null,Do=jt?navigator:null,te,Hl;function On(){let e=devicePixelRatio;te!=e&&(te=e,Hl&&In($s,Hl,On),Hl=matchMedia(`(min-resolution: ${te-.001}dppx) and (max-resolution: ${te+.001}dppx)`),Ct($s,Hl,On),Ut.dispatchEvent(new CustomEvent(Yl)))}function $e(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Hn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function ce(e,t,n){e.style[t]=n+"px"}function ct(e,t,n,s){let r=Nn.createElement(e);return t!=null&&$e(r,t),n?.insertBefore(r,s),r}function et(e,t){return ct("div",e,t)}var Ks=new WeakMap;function Gt(e,t,n,s,r){let f="translate("+t+"px,"+n+"px)",c=Ks.get(e);f!=c&&(e.style.transform=f,Ks.set(e,f),t<0||n<0||t>s||n>r?$e(e,Tt):Hn(e,Tt))}var js=new WeakMap;function Co(e,t,n){let s=t+n,r=js.get(e);s!=r&&(js.set(e,s),e.style.background=t,e.style.borderColor=n)}var Js=new WeakMap;function Eo(e,t,n,s){let r=t+""+n,f=Js.get(e);r!=f&&(Js.set(e,r),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=s?-t/2+"px":0,e.style.marginTop=s?-n/2+"px":0)}var Gn={passive:!0},xi={...Gn,capture:!0};function Ct(e,t,n,s){t.addEventListener(e,n,s?xi:Gn)}function In(e,t,n,s){t.removeEventListener(e,n,s?xi:Gn)}jt&&On();function vt(e,t,n,s){let r;n=n||0,s=s||t.length-1;let f=s<=2147483647;for(;s-n>1;)r=f?n+s>>1:Ke((n+s)/2),t[r]=t&&r<=n;r+=s)if(e[r]!=null)return r;return-1}function Po(e,t,n,s){let r=Q,f=-Q;if(s==1)r=e[t],f=e[n];else if(s==-1)r=e[n],f=e[t];else for(let c=t;c<=n;c++)e[c]!=null&&(r=Ge(r,e[c]),f=Le(f,e[c]));return[r,f]}function Ao(e,t,n){let s=Q,r=-Q;for(let f=t;f<=n;f++)e[f]>0&&(s=Ge(s,e[f]),r=Le(r,e[f]));return[s==Q?1:s,r==-Q?10:r]}var Ln=[0,0];function Zs(e,t,n,s){return Ln[0]=n<0?oe(e,-n):e,Ln[1]=s<0?oe(t,-s):t,Ln}function $l(e,t,n,s){let r=Vo(e),f=n==10?Et:ki;e==t&&(r==-1?(e*=n,t/=n):(e/=n,t*=n));let c,m,d;return s?(c=Ke(f(e)),m=Kn(f(t)),d=Zs(_t(n,c),_t(n,m),c,m),e=d[0],t=d[1]):(c=Ke(f(Ye(e))),m=Ke(f(Ye(t))),d=Zs(_t(n,c),_t(n,m),c,m),e=Ti(e,d[0]),t=Pt(t,d[1])),[e,t]}function qn(e,t,n,s){let r=$l(e,t,n,s);return e==0&&(r[0]=0),t==0&&(r[1]=0),r}var Un=.1,Qs={mode:3,pad:Un},wl={pad:0,soft:null,mode:0},Lo={min:wl,max:wl};function Gl(e,t,n,s){return jl(n)?Xs(e,t,n):(wl.pad=n,wl.soft=s?0:null,wl.mode=s?3:0,Xs(e,t,Lo))}function le(e,t){return e??t}function Ro(e,t,n){for(t=le(t,0),n=le(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function Xs(e,t,n){let s=n.min,r=n.max,f=le(s.pad,0),c=le(r.pad,0),m=le(s.hard,-Q),d=le(r.hard,Q),g=le(s.soft,Q),_=le(r.soft,-Q),y=le(s.mode,0),u=le(r.mode,0),w=t-e;w<1e-9&&(w=0,(e==0||t==0)&&(w=1e-9,y==2&&g!=Q&&(f=0),u==2&&_!=-Q&&(c=0)));let x=w||Ye(t)||1e3,M=Et(x),L=_t(10,Ke(M)),N=x*(w==0?e==0?.1:1:f),E=oe(Ti(e-N,L/10),9),v=e>=g&&(y==1||y==3&&E<=g||y==2&&E>=g)?g:Q,C=Le(m,E=v?v:Ge(v,E)),D=x*(w==0?t==0?.1:1:c),R=oe(Pt(t+D,L/10),9),A=t<=_&&(u==1||u==3&&R>=_||u==2&&R<=_)?_:-Q,W=Ge(d,R>A&&t<=A?A:Le(A,R));return C==W&&C==0&&(W=100),[C,W]}var zo=new Intl.NumberFormat(jt?Do.language:"en-US"),$n=e=>zo.format(e),je=Math,Bl=je.PI,Ye=je.abs,Ke=je.floor,Me=je.round,Kn=je.ceil,Ge=je.min,Le=je.max,_t=je.pow,Vo=je.sign,Et=je.log10,ki=je.log2,Fo=(e,t=1)=>je.sinh(e)*t,Rn=(e,t=1)=>je.asinh(e/t),Q=1/0;function ei(e){return(Et((e^e>>31)-(e>>31))|0)+1}function Mt(e,t){return Me(e/t)*t}function ti(e,t,n){return Ge(Le(e,t),n)}function ee(e){return typeof e=="function"?e:()=>e}var No=e=>e,Mi=(e,t)=>t,Oo=e=>null,li=e=>!0,ni=(e,t)=>e==t;function Pt(e,t){return Kn(e/t)*t}function Ti(e,t){return Ke(e/t)*t}function oe(e,t){return Me(e*(t=10**t))/t}var Kl=new Map;function Ho(e){return((""+e).split(".")[1]||"").length}function vl(e,t,n,s){let r=[],f=s.map(Ho);for(let c=t;c=0&&c>=0?0:m)+(c>=f[g]?0:f[g]),u=oe(_,y);r.push(u),Kl.set(u,y)}}return r}var Sl={},Di=[],Kt=[null,null],Dt=Array.isArray;function si(e){return typeof e=="string"}function jl(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function ii(e){return e!=null&&typeof e=="object"}var Io=Object.getPrototypeOf(Uint8Array);function At(e,t=jl){let n;if(Dt(e)){let s=e.find(r=>r!=null);if(Dt(s)||t(s)){n=Array(e.length);for(let r=0;rf){for(r=c-1;r>=0&&e[r]==null;)e[r--]=null;for(r=c+1;rc-m)],r=s[0].length,f=new Map;for(let c=0;c"u"?e=>Promise.resolve().then(e):queueMicrotask,Ci=["January","February","March","April","May","June","July","August","September","October","November","December"],Ei=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function Pi(e){return e.slice(0,3)}var $o=Ei.map(Pi),Ko=Ci.map(Pi),jo={MMMM:Ci,MMM:Ko,WWWW:Ei,WWW:$o};function dl(e){return(e<10?"0":"")+e}function Jo(e){return(e<10?"00":e<100?"0":"")+e}var Zo={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>dl(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>dl(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>dl(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?"PM":"AM",aa:e=>e.getHours()>=12?"pm":"am",a:e=>e.getHours()>=12?"p":"a",mm:e=>dl(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>dl(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>Jo(e.getMilliseconds())};function jn(e,t){t=t||jo;let n=[],s=/\{([a-z]+)\}|[^{]+/gi,r;for(;r=s.exec(e);)n.push(r[0][0]=="{"?Zo[r[1]]:r[0]);return f=>{let c="";for(let m=0;me%1==0,ql=[1,2,2.5,5],ea=vl(10,-16,0,ql),Li=vl(10,0,16,ql),ta=Li.filter(Ai),la=ea.concat(Li),Jn=` +`,Ri="{YYYY}",ri=Jn+Ri,zi="{M}/{D}",gl=Jn+zi,Il=gl+"/{YY}",Vi="{aa}",na="{h}:{mm}",qt=na+Vi,oi=Jn+qt,ai=":{ss}",ie=null;function Fi(e){let t=e*1e3,n=t*60,s=n*60,r=s*24,f=r*30,c=r*365,d=(e==1?vl(10,0,3,ql).filter(Ai):vl(10,-3,0,ql)).concat([t,t*5,t*10,t*15,t*30,n,n*5,n*10,n*15,n*30,s,s*2,s*3,s*4,s*6,s*8,s*12,r,r*2,r*3,r*4,r*5,r*6,r*7,r*8,r*9,r*10,r*15,f,f*2,f*3,f*4,f*6,c,c*2,c*5,c*10,c*25,c*50,c*100]),g=[[c,Ri,ie,ie,ie,ie,ie,ie,1],[r*28,"{MMM}",ri,ie,ie,ie,ie,ie,1],[r,zi,ri,ie,ie,ie,ie,ie,1],[s,"{h}"+Vi,Il,ie,gl,ie,ie,ie,1],[n,qt,Il,ie,gl,ie,ie,ie,1],[t,ai,Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1],[e,ai+".{fff}",Il+" "+qt,ie,gl+" "+qt,ie,oi,ie,1]];function _(y){return(u,w,x,M,L,N)=>{let E=[],v=L>=c,C=L>=f&&L=r?r:L,$=Ke(x)-Ke(R),P=W+$+Pt(R-W,Y);E.push(P);let U=y(P),re=U.getHours()+U.getMinutes()/n+U.getSeconds()/s,Z=L/s,F=u.axes[w]._space,X=N/F;for(;P=oe(P+L,e==1?0:3),!(P>M);)if(Z>1){let O=Ke(oe(re+Z,6))%24,Fe=y(P).getHours()-O;Fe>1&&(Fe=-1),P-=Fe*s,re=(re+Z)%24;let H=E[E.length-1];oe((P-H)/L,3)*X>=.7&&E.push(P)}else E.push(P)}return E}}return[d,g,_]}var[sa,ia,ra]=Fi(1),[oa,aa,ua]=Fi(.001);vl(2,-53,53,[1]);function ui(e,t){return e.map(n=>n.map((s,r)=>r==0||r==8||s==null?s:t(r==1||n[8]==0?s:n[1]+s)))}function ci(e,t){return(n,s,r,f,c)=>{let m=t.find(x=>c>=x[0])||t[t.length-1],d,g,_,y,u,w;return s.map(x=>{let M=e(x),L=M.getFullYear(),N=M.getMonth(),E=M.getDate(),v=M.getHours(),C=M.getMinutes(),D=M.getSeconds(),R=L!=d&&m[2]||N!=g&&m[3]||E!=_&&m[4]||v!=y&&m[5]||C!=u&&m[6]||D!=w&&m[7]||m[1];return d=L,g=N,_=E,y=v,u=C,w=D,R(M)})}}function ca(e,t){let n=jn(t);return(s,r,f,c,m)=>r.map(d=>n(e(d)))}function zn(e,t,n){return new Date(e,t,n)}function fi(e,t){return t(e)}var fa="{YYYY}-{MM}-{DD} {h}:{mm}{aa}";function hi(e,t){return(n,s)=>t(e(s))}function ha(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null}function da(e,t){return e.series[t].fill(e,t)}var pa={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:ha,fill:da,dash:"solid"},idx:null,idxs:null,values:[]};function ma(e,t){let n=e.cursor.points,s=et(),r=n.size(e,t);ce(s,pl,r),ce(s,ml,r);let f=r/-2;ce(s,"marginLeft",f),ce(s,"marginTop",f);let c=n.width(e,t,r);return c&&ce(s,"borderWidth",c),s}function ga(e,t){let n=e.series[t].points;return n._fill||n._stroke}function wa(e,t){let n=e.series[t].points;return n._stroke||n._fill}function Sa(e,t){let n=e.series[t].points;return Wi(n.width,1)}function va(e,t,n){return n}var Vn=[0,0];function _a(e,t,n){return Vn[0]=t,Vn[1]=n,Vn}function Wl(e,t,n){return s=>{s.button==0&&n(s)}}function Fn(e,t,n){return n}var ya={show:!0,x:!0,y:!0,lock:!1,move:_a,points:{show:ma,size:Sa,width:0,stroke:wa,fill:ga},bind:{mousedown:Wl,mouseup:Wl,click:Wl,dblclick:Wl,mousemove:Fn,mouseleave:Fn,mouseenter:Fn},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:va,idxs:null},Ni={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Zn=we({},Ni,{filter:Mi}),Oi=we({},Zn,{size:10}),Hi=we({},Ni,{show:!1}),Qn='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Ii="bold "+Qn,ba=1.5,di={show:!0,scale:"x",stroke:Yn,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:2,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0},xa="Value",ka="Time",pi={show:!0,scale:"x",auto:!1,sorted:1,min:Q,max:-Q,idxs:[]};function Ma(e,t,n,s,r){return t.map(f=>f==null?"":$n(f))}function Ta(e,t,n,s,r,f,c){let m=[],d=Kl.get(r)||0;n=c?n:oe(Pt(n,r),d);for(let g=n;g<=s;g=oe(g+r,d))m.push(Object.is(g,-0)?0:g);return m}function Wn(e,t,n,s,r,f,c){let m=[],d=e.scales[e.axes[t].scale].log,g=d==10?Et:ki,_=Ke(g(n));r=_t(d,_),_<0&&(r=oe(r,-_));let y=n;do m.push(y),y=oe(y+r,Kl.get(r)),y>=r*d&&(r=y);while(y<=s);return m}function Da(e,t,n,s,r,f,c){let d=e.scales[e.axes[t].scale].asinh,g=s>d?Wn(e,t,Le(d,n),s,r):[d],_=s>=0&&n<=0?[0]:[];return(n<-d?Wn(e,t,Le(d,-s),-n,r):[d]).reverse().map(u=>-u).concat(_,g)}var Ca=/./,Ea=/[12357]/,Pa=/[125]/,Aa=/1/;function La(e,t,n,s,r){let f=e.axes[n],c=f.scale,m=e.scales[c];if(m.distr==3&&m.log==2)return t;let d=e.valToPos,g=f._space,_=d(10,c),y=d(9,c)-_>=g?Ca:d(7,c)-_>=g?Ea:d(5,c)-_>=g?Pa:Aa;return t.map(u=>m.distr==4&&u==0||y.test(u)?u:null)}function Ra(e,t){return t==null?"":$n(t)}var mi={show:!0,scale:"y",stroke:Yn,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Ii,side:3,grid:Zn,ticks:Oi,border:Hi,font:Qn,rotate:0};function Wi(e,t){let n=3+(e||1)*2;return oe(n*t,3)}function za(e,t){let{scale:n,idxs:s}=e.series[0],r=e._data[0],f=e.valToPos(r[s[0]],n,!0),c=e.valToPos(r[s[1]],n,!0),m=Ye(c-f),d=e.series[t],g=m/(d.points.space*te);return s[1]-s[0]<=g}var gi={scale:null,auto:!0,sorted:0,min:Q,max:-Q},Va={show:!0,auto:!0,sorted:0,alpha:1,facets:[we({},gi,{scale:"x"}),we({},gi,{scale:"y"})]},wi={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:(e,t,n,s,r)=>r,alpha:1,points:{show:za,filter:null},values:null,min:Q,max:-Q,idxs:[],path:null,clip:null};function Fa(e,t,n,s,r){return n/10}var Bi={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Na=we({},Bi,{time:!1,ori:1}),Si={};function Yi(e,t){let n=Si[e];return n||(n={key:e,plots:[],sub(s){n.plots.push(s)},unsub(s){n.plots=n.plots.filter(r=>r!=s)},pub(s,r,f,c,m,d,g){for(let _=0;_{let N=c.pxRound,E=g.dir*(g.ori==0?1:-1),v=g.ori==0?Jt:Zt,C,D;E==1?(C=n,D=s):(C=s,D=n);let R=N(y(m[C],g,M,w)),A=N(u(d[C],_,L,x)),W=N(y(m[D],g,M,w)),Y=N(u(f==1?_.max:_.min,_,L,x)),$=new Path2D(r);return v($,W,Y),v($,R,Y),v($,R,A),$})}function Zl(e,t,n,s,r,f){let c=null;if(e.length>0){c=new Path2D;let m=t==0?en:es,d=n;for(let _=0;_y[0]){let u=y[0]-d;u>0&&m(c,d,s,u,s+f),d=y[1]}}let g=n+r-d;g>0&&m(c,d,s,g,s+f)}return c}function Ha(e,t,n){let s=e[e.length-1];s&&s[0]==t?s[1]=n:e.push([t,n])}function Xn(e,t,n,s,r,f,c){let m=[];for(let d=r==1?n:s;d>=n&&d<=s;d+=r)if(t[d]===null){let _=d,y=d;if(r==1)for(;++d<=s&&t[d]===null;)y=d;else for(;--d>=n&&t[d]===null;)y=d;let u=f(e[_]),w=y==_?u:f(e[y]);u=c<=0?f(e[_-r]):u,w=c>=0?f(e[y+r]):w,w>=u&&m.push([u,w])}return m}function vi(e){return e==0?No:e==1?Me:t=>Mt(t,e)}function Gi(e){let t=e==0?Ql:Xl,n=e==0?(r,f,c,m,d,g)=>{r.arcTo(f,c,m,d,g)}:(r,f,c,m,d,g)=>{r.arcTo(c,f,d,m,g)},s=e==0?(r,f,c,m,d)=>{r.rect(f,c,m,d)}:(r,f,c,m,d)=>{r.rect(c,f,d,m)};return(r,f,c,m,d,g=0)=>{g==0?s(r,f,c,m,d):(g=Ge(g,m/2,d/2),t(r,f+g,c),n(r,f+m,c,f+m,c+d,g),n(r,f+m,c+d,f,c+d,g),n(r,f,c+d,f,c,g),n(r,f,c,f+m,c,g),r.closePath())}}var Ql=(e,t,n)=>{e.moveTo(t,n)},Xl=(e,t,n)=>{e.moveTo(n,t)},Jt=(e,t,n)=>{e.lineTo(t,n)},Zt=(e,t,n)=>{e.lineTo(n,t)},en=Gi(0),es=Gi(1),qi=(e,t,n,s,r,f)=>{e.arc(t,n,s,r,f)},Ui=(e,t,n,s,r,f)=>{e.arc(n,t,s,r,f)},$i=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(t,n,s,r,f,c)},Ki=(e,t,n,s,r,f,c)=>{e.bezierCurveTo(n,t,r,s,c,f)};function ji(e){return(t,n,s,r,f)=>Rt(t,n,(c,m,d,g,_,y,u,w,x,M,L)=>{let{pxRound:N,points:E}=c,v,C;g.ori==0?(v=Ql,C=qi):(v=Xl,C=Ui);let D=oe(E.width*te,3),R=(E.size-E.width)/2*te,A=oe(R*2,3),W=new Path2D,Y=new Path2D,{left:$,top:P,width:U,height:re}=t.bbox;en(Y,$-A,P-A,U+A*2,re+A*2);let Z=F=>{if(d[F]!=null){let X=N(y(m[F],g,M,w)),O=N(u(d[F],_,L,x));v(W,X+R,O),C(W,X,O,R,0,Bl*2)}};if(f)f.forEach(Z);else for(let F=s;F<=r;F++)Z(F);return{stroke:D>0?W:null,fill:W,clip:Y,flags:Lt|Ul}})}function Ji(e){return(t,n,s,r,f,c)=>{s!=r&&(f!=s&&c!=s&&e(t,n,s),f!=r&&c!=r&&e(t,n,r),e(t,n,c))}}var Ia=Ji(Jt),Wa=Ji(Zt);function Zi(e){let t=le(e?.alignGaps,0);return(n,s,r,f)=>Rt(n,s,(c,m,d,g,_,y,u,w,x,M,L)=>{let N=c.pxRound,E=H=>N(y(H,g,M,w)),v=H=>N(u(H,_,L,x)),C,D;g.ori==0?(C=Jt,D=Ia):(C=Zt,D=Wa);let R=g.dir*(g.ori==0?1:-1),A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=Q,$=-Q,P,U,re,Z=E(m[R==1?r:f]),F=$t(d,r,f,1*R),X=$t(d,r,f,-1*R),O=E(m[F]),Re=E(m[X]);for(let H=R==1?r:f;H>=r&&H<=f;H+=R){let I=E(m[H]);I==Z?d[H]!=null&&(U=v(d[H]),Y==Q&&(C(W,I,U),P=U),Y=Ge(U,Y),$=Le(U,$)):(Y!=Q&&(D(W,Z,Y,$,P,U),re=Z),d[H]!=null?(U=v(d[H]),C(W,I,U),Y=$=P=U):(Y=Q,$=-Q),Z=I)}Y!=Q&&Y!=$&&re!=Z&&D(W,Z,Y,$,P,U);let[Te,Fe]=Jl(n,s);if(c.fill!=null||Te!=0){let H=A.fill=new Path2D(W),I=c.fillTo(n,s,c.min,c.max,Te),De=v(I);C(H,Re,De),C(H,O,De)}if(!c.spanGaps){let H=[];H.push(...Xn(m,d,r,f,R,E,t)),A.gaps=H=c.gaps(n,s,r,f,H),A.clip=Zl(H,g.ori,w,x,M,L)}return Fe!=0&&(A.band=Fe==2?[ft(n,s,r,f,W,-1),ft(n,s,r,f,W,1)]:ft(n,s,r,f,W,Fe)),A})}function Ba(e){let t=le(e.align,1),n=le(e.ascDesc,!1),s=le(e.alignGaps,0);return(r,f,c,m)=>Rt(r,f,(d,g,_,y,u,w,x,M,L,N,E)=>{let v=d.pxRound,C=F=>v(w(F,y,N,M)),D=F=>v(x(F,u,E,L)),R=y.ori==0?Jt:Zt,A={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:Lt},W=A.stroke,Y=y.dir*(y.ori==0?1:-1);c=$t(_,c,m,1),m=$t(_,c,m,-1);let $=D(_[Y==1?c:m]),P=C(g[Y==1?c:m]),U=P;R(W,P,$);for(let F=Y==1?c:m;F>=c&&F<=m;F+=Y){let X=_[F];if(X==null)continue;let O=C(g[F]),Re=D(X);t==1?R(W,O,$):R(W,U,Re),R(W,O,Re),$=Re,U=O}let[re,Z]=Jl(r,f);if(d.fill!=null||re!=0){let F=A.fill=new Path2D(W),X=d.fillTo(r,f,d.min,d.max,re),O=D(X);R(F,U,O),R(F,P,O)}if(!d.spanGaps){let F=[];F.push(...Xn(g,_,c,m,Y,C,s));let X=d.width*te/2,O=n||t==1?X:-X,Re=n||t==-1?-X:X;F.forEach(Te=>{Te[0]+=O,Te[1]+=Re}),A.gaps=F=d.gaps(r,f,c,m,F),A.clip=Zl(F,y.ori,M,L,N,E)}return Z!=0&&(A.band=Z==2?[ft(r,f,c,m,W,-1),ft(r,f,c,m,W,1)]:ft(r,f,c,m,W,Z)),A})}function Ya(e){e=e||Sl;let t=le(e.size,[.6,Q,1]),n=e.align||0,s=(e.gap||0)*te,r=le(e.radius,0),f=1-t[0],c=le(t[1],Q)*te,m=le(t[2],1)*te,d=le(e.disp,Sl),g=le(e.each,u=>{}),{fill:_,stroke:y}=d;return(u,w,x,M)=>Rt(u,w,(L,N,E,v,C,D,R,A,W,Y,$)=>{let P=L.pxRound,U=v.dir*(v.ori==0?1:-1),re=C.dir*(C.ori==1?1:-1),Z=v.ori==0?en:es,F=v.ori==0?g:(ne,Ne,qe,G,j,pe,_e)=>{g(ne,Ne,qe,j,G,_e,pe)},[X,O]=Jl(u,w),Re=C.distr==3?X==1?C.max:C.min:0,Te=R(Re,C,$,W),Fe,H,I=P(L.width*te),De=!1,de=null,Je=null,st=null,ht=null;_!=null&&(I==0||y!=null)&&(De=!0,de=_.values(u,w,x,M),Je=new Map,new Set(de).forEach(ne=>{ne!=null&&Je.set(ne,new Path2D)}),I>0&&(st=y.values(u,w,x,M),ht=new Map,new Set(st).forEach(ne=>{ne!=null&&ht.set(ne,new Path2D)})));let{x0:dt,size:Ze}=d;if(dt!=null&&Ze!=null){N=dt.values(u,w,x,M),dt.unit==2&&(N=N.map(Ne=>u.posToVal(A+Ne*Y,v.key,!0)));let ne=Ze.values(u,w,x,M);Ze.unit==2?H=ne[0]*Y:H=D(ne[0],v,Y,A)-D(0,v,Y,A),H=P(H-I),Fe=U==1?-I/2:H+I/2}else{let ne=Y;if(N.length>1){let qe=null;for(let G=0,j=1/0;G=x&&ne<=M;ne+=U){let Ne=E[ne];if(Ne===void 0)continue;let qe=v.distr!=2||d!=null?N[ne]:ne,G=D(qe,v,Y,A),j=R(le(Ne,Re),C,$,W);Qe!=null&&Ne!=null&&(Te=R(Qe[ne],C,$,W));let pe=P(G-Fe),_e=P(Le(j,Te)),ye=P(Ge(j,Te)),He=_e-ye,tt=r*H;Ne!=null&&(De?(I>0&&st[ne]!=null&&Z(ht.get(st[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt),de[ne]!=null&&Z(Je.get(de[ne]),pe,ye+Ke(I/2),H,Le(0,He-I),tt)):Z(Vt,pe,ye+Ke(I/2),H,Le(0,He-I),tt),F(u,w,ne,pe-I/2,ye,H+I,He)),O!=0&&(re*O==1?(_e=ye,ye=Qt):(ye=_e,_e=Qt),He=_e-ye,Z(on,pe-I/2,ye,H+I,Le(0,He),0))}return I>0&&(ot.stroke=De?ht:Vt),ot.fill=De?Je:Vt,ot})}function Ga(e,t){let n=le(t?.alignGaps,0);return(s,r,f,c)=>Rt(s,r,(m,d,g,_,y,u,w,x,M,L,N)=>{let E=m.pxRound,v=O=>E(u(O,_,L,x)),C=O=>E(w(O,y,N,M)),D,R,A;_.ori==0?(D=Ql,A=Jt,R=$i):(D=Xl,A=Zt,R=Ki);let W=_.dir*(_.ori==0?1:-1);f=$t(g,f,c,1),c=$t(g,f,c,-1);let Y=v(d[W==1?f:c]),$=Y,P=[],U=[];for(let O=W==1?f:c;O>=f&&O<=c;O+=W)if(g[O]!=null){let Te=d[O],Fe=v(Te);P.push($=Fe),U.push(C(g[O]))}let re={stroke:e(P,U,D,A,R,E),fill:null,clip:null,band:null,gaps:null,flags:Lt},Z=re.stroke,[F,X]=Jl(s,r);if(m.fill!=null||F!=0){let O=re.fill=new Path2D(Z),Re=m.fillTo(s,r,m.min,m.max,F),Te=C(Re);A(O,$,Te),A(O,Y,Te)}if(!m.spanGaps){let O=[];O.push(...Xn(d,g,f,c,W,v,n)),re.gaps=O=m.gaps(s,r,f,c,O),re.clip=Zl(O,_.ori,x,M,L,N)}return X!=0&&(re.band=X==2?[ft(s,r,f,c,Z,-1),ft(s,r,f,c,Z,1)]:ft(s,r,f,c,Z,X)),re})}function qa(e){return Ga(Ua,e)}function Ua(e,t,n,s,r,f){let c=e.length;if(c<2)return null;let m=new Path2D;if(n(m,e[0],t[0]),c==2)s(m,e[1],t[1]);else{let d=Array(c),g=Array(c-1),_=Array(c-1),y=Array(c-1);for(let u=0;u0!=g[u]>0?d[u]=0:(d[u]=3*(y[u-1]+y[u])/((2*y[u]+y[u-1])/g[u-1]+(y[u]+2*y[u-1])/g[u]),isFinite(d[u])||(d[u]=0));d[c-1]=g[c-2];for(let u=0;u{e.syncRect(!0)})}jt&&(Ct(Mo,Ut,_i),Ct(To,Ut,_i,!0),Ct(Yl,Ut,()=>{Se.pxRatio=te}));var $a=Zi(),Ka=ji();function yi(e,t,n,s){return(s?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((f,c)=>Qi(f,c,t,n))}function ja(e,t){return e.map((n,s)=>s==0?null:we({},t,n))}function Qi(e,t,n,s){return we({},t==0?n:s,e)}function Xi(e,t,n){return t==null?Kt:[t,n]}var Ja=Xi;function Za(e,t,n){return t==null?Kt:Gl(t,n,Un,!0)}function er(e,t,n,s){return t==null?Kt:$l(t,n,e.scales[s].log,!1)}var Qa=er;function tr(e,t,n,s){return t==null?Kt:qn(t,n,e.scales[s].log,!1)}var Xa=tr;function eu(e,t,n,s,r){let f=Le(ei(e),ei(t)),c=t-e,m=vt(r/s*c,n);do{let d=n[m],g=s*d/c;if(g>=r&&f+(d<5?Kl.get(d):0)<=17)return[d,g]}while(++m(t=Me((n=+r)*te))+"px"),[e,t,n]}function tu(e){e.show&&[e.font,e.labelFont].forEach(t=>{let n=oe(t[2]*te,1);t[0]=t[0].replace(/[0-9.]+px/,n+"px"),t[1]=n})}function Se(e,t,n){let s={mode:le(e.mode,1)},r=s.mode;function f(l,i){return((i.distr==3?Et(l>0?l:i.clamp(s,l,i.min,i.max,i.key)):i.distr==4?Rn(l,i.asinh):l)-i._min)/(i._max-i._min)}function c(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?1-h:h)}function m(l,i,o,a){let h=f(l,i);return a+o*(i.dir==-1?h:1-h)}function d(l,i,o,a){return i.ori==0?c(l,i,o,a):m(l,i,o,a)}s.valToPosH=c,s.valToPosV=m;let g=!1;s.status=0;let _=s.root=et(io);if(e.id!=null&&(_.id=e.id),$e(_,e.class),e.title){let l=et(ao,_);l.textContent=e.title}let y=ct("canvas"),u=s.ctx=y.getContext("2d"),w=et(uo,_),x=s.under=et(co,w);w.appendChild(y);let M=s.over=et(fo,w);e=At(e);let L=+le(e.pxAlign,1),N=vi(L);(e.plugins||[]).forEach(l=>{l.opts&&(e=l.opts(s,e)||e)});let E=e.ms||.001,v=s.series=r==1?yi(e.series||[],pi,wi,!1):ja(e.series||[null],Va),C=s.axes=yi(e.axes||[],di,mi,!0),D=s.scales={},R=s.bands=e.bands||[];R.forEach(l=>{l.fill=ee(l.fill||null),l.dir=le(l.dir,-1)});let A=r==2?v[1].facets[0].scale:v[0].scale,W={axes:Fr,series:Ar},Y=(e.drawOrder||["axes","series"]).map(l=>W[l]);function $(l){let i=D[l];if(i==null){let o=(e.scales||Sl)[l]||Sl;if(o.from!=null)$(o.from),D[l]=we({},D[o.from],o,{key:l});else{i=D[l]=we({},l==A?Bi:Na,o),i.key=l;let a=i.time,h=i.range,p=Dt(h);if((l!=A||r==2&&!a)&&(p&&(h[0]==null||h[1]==null)&&(h={min:h[0]==null?Qs:{mode:1,hard:h[0],soft:h[0]},max:h[1]==null?Qs:{mode:1,hard:h[1],soft:h[1]}},p=!1),!p&&jl(h))){let S=h;h=(b,T,V)=>T==null?Kt:Gl(T,V,S)}i.range=ee(h||(a?Ja:l==A?i.distr==3?Qa:i.distr==4?Xa:Xi:i.distr==3?er:i.distr==4?tr:Za)),i.auto=ee(p?!1:i.auto),i.clamp=ee(i.clamp||Fa),i._min=i._max=null}}}$("x"),$("y"),r==1&&v.forEach(l=>{$(l.scale)}),C.forEach(l=>{$(l.scale)});for(let l in e.scales)$(l);let P=D[A],U=P.distr,re,Z;P.ori==0?($e(_,ro),re=c,Z=m):($e(_,oo),re=m,Z=c);let F={};for(let l in D){let i=D[l];(i.min!=null||i.max!=null)&&(F[l]={min:i.min,max:i.max},i.min=i.max=null)}let X=e.tzDate||(l=>new Date(Me(l/E))),O=e.fmtDate||jn,Re=E==1?ra(X):ua(X),Te=ci(X,ui(E==1?ia:aa,O)),Fe=hi(X,fi(fa,O)),H=[],I=s.legend=we({},pa,e.legend),De=I.show,de=I.markers;I.idxs=H,de.width=ee(de.width),de.dash=ee(de.dash),de.stroke=ee(de.stroke),de.fill=ee(de.fill);let Je,st=[],ht=[],dt,Ze=!1,ot={};if(I.live){let l=v[1]?v[1].values:null;Ze=l!=null,dt=Ze?l(s,1,0):{_:0};for(let i in dt)ot[i]="--"}if(De)if(Je=ct("table",So,_),Ze){let l=ct("tr",yo,Je);ct("th",null,l);for(var Qt in dt)ct("th",Hs,l).textContent=Qt}else $e(Je,_o),I.live&&$e(Je,vo);let Vt={show:!0},on={show:!1};function bl(l,i){if(i==0&&(Ze||!I.live||r==2))return Kt;let o=[],a=ct("tr",bo,Je,Je.childNodes[i]);$e(a,l.class),l.show||$e(a,Tt);let h=ct("th",null,a);if(de.show){let b=et(xo,h);if(i>0){let T=de.width(s,i);T&&(b.style.border=T+"px "+de.dash(s,i)+" "+de.stroke(s,i)),b.style.background=de.fill(s,i)}}let p=et(Hs,h);p.textContent=l.label,i>0&&(de.show||(p.style.color=l.width>0?de.stroke(s,i):de.fill(s,i)),Qe("click",h,b=>{if(B._lock)return;let T=v.indexOf(l);if((b.ctrlKey||b.metaKey)!=I.isolate){let V=v.some((k,z)=>z>0&&z!=T&&k.show);v.forEach((k,z)=>{z>0&&rt(z,V?z==T?Vt:on:Vt,!0,Ae.setSeries)})}else rt(T,{show:!l.show},!0,Ae.setSeries)}),Ml&&Qe(Gs,h,b=>{B._lock||rt(v.indexOf(l),Ht,!0,Ae.setSeries)}));for(var S in dt){let b=ct("td",ko,a);b.textContent="--",o.push(b)}return[a,o]}let pt=new Map;function Qe(l,i,o){let a=pt.get(i)||{},h=B.bind[l](s,i,o);h&&(Ct(l,i,a[l]=h),pt.set(i,a))}function ne(l,i,o){let a=pt.get(i)||{};for(let h in a)(l==null||h==l)&&(In(h,i,a[h]),delete a[h]);l==null&&pt.delete(i)}let Ne=0,qe=0,G=0,j=0,pe=0,_e=0,ye=0,He=0,tt=0,yt=0;s.bbox={};let an=!1,xl=!1,Ft=!1,Xt=!1,it=!1;function un(l,i,o){(o||l!=s.width||i!=s.height)&&rs(l,i),ll(!1),Ft=!0,xl=!0,Xt=it=B.left>=0,xt()}function rs(l,i){s.width=Ne=G=l,s.height=qe=j=i,pe=_e=0,xr(),kr();let o=s.bbox;ye=o.left=Mt(pe*te,.5),He=o.top=Mt(_e*te,.5),tt=o.width=Mt(G*te,.5),yt=o.height=Mt(j*te,.5)}let _r=3;function yr(){let l=!1,i=0;for(;!l;){i++;let o=zr(i),a=Vr(i);l=i==_r||o&&a,l||(rs(s.width,s.height),xl=!0)}}function br({width:l,height:i}){un(l,i)}s.setSize=br;function xr(){let l=!1,i=!1,o=!1,a=!1;C.forEach((h,p)=>{if(h.show&&h._show){let{side:S,_size:b}=h,T=S%2,V=h.label!=null?h.labelSize:0,k=b+V;k>0&&(T?(G-=k,S==3?(pe+=k,a=!0):o=!0):(j-=k,S==0?(_e+=k,l=!0):i=!0))}}),bt[0]=l,bt[1]=o,bt[2]=i,bt[3]=a,G-=mt[1]+mt[3],pe+=mt[3],j-=mt[2]+mt[0],_e+=mt[0]}function kr(){let l=pe+G,i=_e+j,o=pe,a=_e;function h(p,S){switch(p){case 1:return l+=S,l-S;case 2:return i+=S,i-S;case 3:return o-=S,o+S;case 0:return a-=S,a+S}}C.forEach((p,S)=>{if(p.show&&p._show){let b=p.side;p._pos=h(b,p._size),p.label!=null&&(p._lpos=h(b,p.labelSize))}})}let B=s.cursor=we({},ya,{drag:{y:r==2}},e.cursor);{B.idxs=H,B._lock=!1;let l=B.points;l.show=ee(l.show),l.size=ee(l.size),l.stroke=ee(l.stroke),l.width=ee(l.width),l.fill=ee(l.fill)}let kl=s.focus=we({},e.focus||{alpha:.3},B.focus),Ml=kl.prox>=0,Ie=[null];function Mr(l,i){if(i>0){let o=B.points.show(s,i);if(o)return $e(o,wo),$e(o,l.class),Gt(o,-10,-10,G,j),M.insertBefore(o,Ie[i]),o}}function os(l,i){if(r==1||i>0){let o=r==1&&D[l.scale].time,a=l.value;l.value=o?si(a)?hi(X,fi(a,O)):a||Fe:a||Ra,l.label=l.label||(o?ka:xa)}if(i>0){l.width=l.width==null?1:l.width,l.paths=l.paths||$a||Oo,l.fillTo=ee(l.fillTo||Oa),l.pxAlign=+le(l.pxAlign,L),l.pxRound=vi(l.pxAlign),l.stroke=ee(l.stroke||null),l.fill=ee(l.fill||null),l._stroke=l._fill=l._paths=l._focus=null;let o=Wi(l.width,1),a=l.points=we({},{size:o,width:Le(1,o*.2),stroke:l.stroke,space:o*2,paths:Ka,_stroke:null,_fill:null},l.points);a.show=ee(a.show),a.filter=ee(a.filter),a.fill=ee(a.fill),a.stroke=ee(a.stroke),a.paths=ee(a.paths),a.pxAlign=l.pxAlign}if(De){let o=bl(l,i);st.splice(i,0,o[0]),ht.splice(i,0,o[1]),I.values.push(null)}if(B.show){H.splice(i,0,null);let o=Mr(l,i);o&&Ie.splice(i,0,o)}Pe("addSeries",i)}function Tr(l,i){i=i??v.length,l=Qi(l,i,pi,wi),v.splice(i,0,l),os(v[i],i)}s.addSeries=Tr;function Dr(l){if(v.splice(l,1),De){I.values.splice(l,1),ht.splice(l,1);let i=st.splice(l,1)[0];ne(null,i.firstChild),i.remove()}B.show&&(H.splice(l,1),Ie.length>1&&Ie.splice(l,1)[0].remove()),Pe("delSeries",l)}s.delSeries=Dr;let bt=[!1,!1,!1,!1];function Cr(l,i){if(l._show=l.show,l.show){let o=l.side%2,a=D[l.scale];a==null&&(l.scale=o?v[1].scale:A,a=D[l.scale]);let h=a.time;l.size=ee(l.size),l.space=ee(l.space),l.rotate=ee(l.rotate),l.incrs=ee(l.incrs||(a.distr==2?ta:h?E==1?sa:oa:la)),l.splits=ee(l.splits||(h&&a.distr==1?Re:a.distr==3?Wn:a.distr==4?Da:Ta)),l.stroke=ee(l.stroke),l.grid.stroke=ee(l.grid.stroke),l.ticks.stroke=ee(l.ticks.stroke),l.border.stroke=ee(l.border.stroke);let p=l.values;l.values=Dt(p)&&!Dt(p[0])?ee(p):h?Dt(p)?ci(X,ui(p,O)):si(p)?ca(X,p):p||Te:p||Ma,l.filter=ee(l.filter||(a.distr>=3?La:Mi)),l.font=bi(l.font),l.labelFont=bi(l.labelFont),l._size=l.size(s,null,i,0),l._space=l._rotate=l._incrs=l._found=l._splits=l._values=null,l._size>0&&(bt[i]=!0,l._el=et(ho,w))}}function el(l,i,o,a){let[h,p,S,b]=o,T=i%2,V=0;return T==0&&(b||p)&&(V=i==0&&!h||i==2&&!S?Me(di.size/3):0),T==1&&(h||S)&&(V=i==1&&!p||i==3&&!b?Me(mi.size/2):0),V}let as=s.padding=(e.padding||[el,el,el,el]).map(l=>ee(le(l,el))),mt=s._padding=as.map((l,i)=>l(s,i,bt,0)),be,Ce=null,Ee=null,Tl=r==1?v[0].idxs:null,lt=null,Dl=!1;function us(l,i){if(t=l==null?[]:At(l,ii),r==2){be=0;for(let o=1;o=0,it=!0,xt()}}s.setData=us;function cn(){Dl=!0;let l,i;r==1&&(be>0?(Ce=Tl[0]=0,Ee=Tl[1]=be-1,l=t[0][Ce],i=t[0][Ee],U==2?(l=Ce,i=Ee):be==1&&(U==3?[l,i]=$l(l,l,P.log,!1):U==4?[l,i]=qn(l,l,P.log,!1):P.time?i=l+Me(86400/E):[l,i]=Gl(l,i,Un,!0))):(Ce=Tl[0]=l=null,Ee=Tl[1]=i=null)),Ot(A,l,i)}let Cl,Nt,fn,hn,dn,pn,mn,gn,wn,tl;function cs(l=Ws,i,o=Di,a="butt",h=Ws,p="round"){l!=Cl&&(u.strokeStyle=Cl=l),h!=Nt&&(u.fillStyle=Nt=h),i!=fn&&(u.lineWidth=fn=i),p!=dn&&(u.lineJoin=dn=p),a!=pn&&(u.lineCap=pn=a),o!=hn&&u.setLineDash(hn=o)}function fs(l,i,o,a){i!=Nt&&(u.fillStyle=Nt=i),l!=mn&&(u.font=mn=l),o!=gn&&(u.textAlign=gn=o),a!=wn&&(u.textBaseline=wn=a)}function Sn(l,i,o,a,h=0){if(a.length>0&&l.auto(s,Dl)&&(i==null||i.min==null)){let p=le(Ce,0),S=le(Ee,a.length-1),b=o.min==null?l.distr==3?Ao(a,p,S):Po(a,p,S,h):[o.min,o.max];l.min=Ge(l.min,o.min=b[0]),l.max=Le(l.max,o.max=b[1])}}function Er(){let l=At(D,ii);for(let a in l){let h=l[a],p=F[a];if(p!=null&&p.min!=null)we(h,p),a==A&&ll(!0);else if(a!=A||r==2)if(be==0&&h.from==null){let S=h.range(s,null,null,a);h.min=S[0],h.max=S[1]}else h.min=Q,h.max=-Q}if(be>0){v.forEach((a,h)=>{if(r==1){let p=a.scale,S=l[p],b=F[p];if(h==0){let T=S.range(s,S.min,S.max,p);S.min=T[0],S.max=T[1],Ce=vt(S.min,t[0]),Ee=vt(S.max,t[0]),t[0][Ce]S.max&&Ee--,a.min=lt[Ce],a.max=lt[Ee]}else a.show&&a.auto&&Sn(S,b,a,t[h],a.sorted);a.idxs[0]=Ce,a.idxs[1]=Ee}else if(h>0&&a.show&&a.auto){let[p,S]=a.facets,b=p.scale,T=S.scale,[V,k]=t[h];Sn(l[b],F[b],p,V,p.sorted),Sn(l[T],F[T],S,k,S.sorted),a.min=S.min,a.max=S.max}});for(let a in l){let h=l[a],p=F[a];if(h.from==null&&(p==null||p.min==null)){let S=h.range(s,h.min==Q?null:h.min,h.max==-Q?null:h.max,a);h.min=S[0],h.max=S[1]}}}for(let a in l){let h=l[a];if(h.from!=null){let p=l[h.from];if(p.min==null)h.min=h.max=null;else{let S=h.range(s,p.min,p.max,a);h.min=S[0],h.max=S[1]}}}let i={},o=!1;for(let a in l){let h=l[a],p=D[a];if(p.min!=h.min||p.max!=h.max){p.min=h.min,p.max=h.max;let S=p.distr;p._min=S==3?Et(p.min):S==4?Rn(p.min,p.asinh):p.min,p._max=S==3?Et(p.max):S==4?Rn(p.max,p.asinh):p.max,i[a]=o=!0}}if(o){v.forEach((a,h)=>{r==2?h>0&&i.y&&(a._paths=null):i[a.scale]&&(a._paths=null)});for(let a in i)Ft=!0,Pe("setScale",a);B.show&&(Xt=it=B.left>=0)}for(let a in F)F[a]=null}function Pr(l){let i=ti(Ce-1,0,be-1),o=ti(Ee+1,0,be-1);for(;l[i]==null&&i>0;)i--;for(;l[o]==null&&o0&&(v.forEach((l,i)=>{if(i>0&&l.show&&l._paths==null){let o=Pr(t[i]);l._paths=l.paths(s,i,o[0],o[1])}}),v.forEach((l,i)=>{if(i>0&&l.show){tl!=l.alpha&&(u.globalAlpha=tl=l.alpha),hs(i,!1),l._paths&&ds(i,!1);{hs(i,!0);let o=l.points.show(s,i,Ce,Ee),a=l.points.filter(s,i,o,l._paths?l._paths.gaps:null);(o||a)&&(l.points._paths=l.points.paths(s,i,Ce,Ee,a),ds(i,!0))}tl!=1&&(u.globalAlpha=tl=1),Pe("drawSeries",i)}}))}function hs(l,i){let o=i?v[l].points:v[l];o._stroke=o.stroke(s,l),o._fill=o.fill(s,l)}function ds(l,i){let o=i?v[l].points:v[l],a=o._stroke,h=o._fill,{stroke:p,fill:S,clip:b,flags:T}=o._paths,V=null,k=oe(o.width*te,3),z=k%2/2;i&&h==null&&(h=k>0?"#fff":a);let q=o.pxAlign==1;if(q&&u.translate(z,z),!i){let me=ye,K=He,ae=tt,J=yt,se=k*te/2;o.min==0&&(J+=se),o.max==0&&(K-=se,J+=se),V=new Path2D,V.rect(me,K,ae,J)}i?vn(a,k,o.dash,o.cap,h,p,S,T,b):Lr(l,a,k,o.dash,o.cap,h,p,S,T,V,b),q&&u.translate(-z,-z)}function Lr(l,i,o,a,h,p,S,b,T,V,k){let z=!1;R.forEach((q,me)=>{if(q.series[0]==l){let K=v[q.series[1]],ae=t[q.series[1]],J=(K._paths||Sl).band;Dt(J)&&(J=q.dir==1?J[0]:J[1]);let se,ge=null;K.show&&J&&Ro(ae,Ce,Ee)?(ge=q.fill(s,me)||p,se=K._paths.clip):J=null,vn(i,o,a,h,ge,S,b,T,V,k,se,J),z=!0}}),z||vn(i,o,a,h,p,S,b,T,V,k)}let ps=Lt|Ul;function vn(l,i,o,a,h,p,S,b,T,V,k,z){cs(l,i,o,a,h),(T||V||z)&&(u.save(),T&&u.clip(T),V&&u.clip(V)),z?(b&ps)==ps?(u.clip(z),k&&u.clip(k),Pl(h,S),El(l,p,i)):b&Ul?(Pl(h,S),u.clip(z),El(l,p,i)):b&Lt&&(u.save(),u.clip(z),k&&u.clip(k),Pl(h,S),u.restore(),El(l,p,i)):(Pl(h,S),El(l,p,i)),(T||V||z)&&u.restore()}function El(l,i,o){o>0&&(i instanceof Map?i.forEach((a,h)=>{u.strokeStyle=Cl=h,u.stroke(a)}):i!=null&&l&&u.stroke(i))}function Pl(l,i){i instanceof Map?i.forEach((o,a)=>{u.fillStyle=Nt=a,u.fill(o)}):i!=null&&l&&u.fill(i)}function Rr(l,i,o,a){let h=C[l],p;if(a<=0)p=[0,0];else{let S=h._space=h.space(s,l,i,o,a),b=h._incrs=h.incrs(s,l,i,o,a,S);p=eu(i,o,b,a,S)}return h._found=p}function _n(l,i,o,a,h,p,S,b,T,V){let k=S%2/2;L==1&&u.translate(k,k),cs(b,S,T,V,b),u.beginPath();let z,q,me,K,ae=h+(a==0||a==3?-p:p);o==0?(q=h,K=ae):(z=h,me=ae);for(let J=0;J{if(!o.show)return;let h=D[o.scale];if(h.min==null){o._show&&(i=!1,o._show=!1,ll(!1));return}else o._show||(i=!1,o._show=!0,ll(!1));let p=o.side,S=p%2,{min:b,max:T}=h,[V,k]=Rr(a,b,T,S==0?G:j);if(k==0)return;let z=h.distr==2,q=o._splits=o.splits(s,a,b,T,V,k,z),me=h.distr==2?q.map(se=>lt[se]):q,K=h.distr==2?lt[q[1]]-lt[q[0]]:V,ae=o._values=o.values(s,o.filter(s,me,a,k,K),a,k,K);o._rotate=p==2?o.rotate(s,ae,a,k):0;let J=o._size;o._size=Kn(o.size(s,ae,a,l)),J!=null&&o._size!=J&&(i=!1)}),i}function Vr(l){let i=!0;return as.forEach((o,a)=>{let h=o(s,a,bt,l);h!=mt[a]&&(i=!1),mt[a]=h}),i}function Fr(){for(let l=0;llt[nt]):K,J=k.distr==2?lt[K[1]]-lt[K[0]]:T,se=i.ticks,ge=i.border,We=se.show?Me(se.size*te):0,ue=i._rotate*-Bl/180,Ve=N(i._pos*te),Be=(We+me)*b,Oe=Ve+Be;p=a==0?Oe:0,h=a==1?Oe:0;let Ue=i.font[0],wt=i.align==1?Yt:i.align==2?Pn:ue>0?Yt:ue<0?Pn:a==0?"center":o==3?Pn:Yt,St=ue||a==1?"middle":o==2?hl:Is;fs(Ue,S,wt,St);let Es=i.font[1]*ba,Nl=K.map(nt=>N(d(nt,k,z,q))),Ps=i._values;for(let nt=0;nt{o>0&&(i._paths=null,l&&(r==1?(i.min=null,i.max=null):i.facets.forEach(a=>{a.min=null,a.max=null})))})}let yn=!1;function xt(){yn||(Uo(Nr),yn=!0)}function Nr(){an&&(Er(),an=!1),Ft&&(yr(),Ft=!1),xl&&(ce(x,Yt,pe),ce(x,hl,_e),ce(x,pl,G),ce(x,ml,j),ce(M,Yt,pe),ce(M,hl,_e),ce(M,pl,G),ce(M,ml,j),ce(w,pl,Ne),ce(w,ml,qe),y.width=Me(Ne*te),y.height=Me(qe*te),C.forEach(({_el:l,_show:i,_size:o,_pos:a,side:h})=>{if(l!=null)if(i){let p=h===3||h===0?o:0,S=h%2==1;ce(l,S?"left":"top",a-p),ce(l,S?"width":"height",o),ce(l,S?"top":"left",S?_e:pe),ce(l,S?"height":"width",S?j:G),Hn(l,Tt)}else $e(l,Tt)}),Cl=Nt=fn=dn=pn=mn=gn=wn=hn=null,tl=1,Vl(!0),Pe("setSize"),xl=!1),Ne>0&&qe>0&&(u.clearRect(0,0,y.width,y.height),Pe("drawClear"),Y.forEach(l=>l()),Pe("draw")),B.show&&Xt&&(gt(null,!0,!1),Xt=!1),g||(g=!0,s.status=1,Pe("ready")),Dl=!1,yn=!1}s.redraw=(l,i)=>{Ft=i||!1,l!==!1?Ot(A,P.min,P.max):xt()};function bn(l,i){let o=D[l];if(o.from==null){if(be==0){let a=o.range(s,i.min,i.max,l);i.min=a[0],i.max=a[1]}if(i.min>i.max){let a=i.min;i.min=i.max,i.max=a}if(be>1&&i.min!=null&&i.max!=null&&i.max-i.min<1e-16)return;l==A&&o.distr==2&&be>0&&(i.min=vt(i.min,t[0]),i.max=vt(i.max,t[0]),i.min==i.max&&i.max++),F[l]=i,an=!0,xt()}}s.setScale=bn;let xn,kn,Al,Ll,ms,gs,nl,sl,ws,Ss,fe,he,kt=!1,ze=B.drag,xe=ze.x,ke=ze.y;B.show&&(B.x&&(xn=et(mo,M)),B.y&&(kn=et(go,M)),P.ori==0?(Al=xn,Ll=kn):(Al=kn,Ll=xn),fe=B.left,he=B.top);let Xe=s.select=we({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),il=Xe.show?et(po,Xe.over?M:x):null;function Rl(l,i){if(Xe.show){for(let o in l)ce(il,o,Xe[o]=l[o]);i!==!1&&Pe("setSelect")}}s.setSelect=Rl;function Or(l,i){let o=v[l],a=De?st[l]:null;o.show?a&&Hn(a,Tt):(a&&$e(a,Tt),Ie.length>1&&Gt(Ie[l],-10,-10,G,j))}function Ot(l,i,o){bn(l,{min:i,max:o})}function rt(l,i,o,a){i.focus!=null&&Yr(l),i.show!=null&&v.forEach((h,p)=>{p>0&&(l==p||l==null)&&(h.show=i.show,Or(p,i.show),Ot(r==2?h.facets[1].scale:h.scale,null,null),xt())}),o!==!1&&Pe("setSeries",l,i),a&&cl("setSeries",s,l,i)}s.setSeries=rt;function Hr(l,i){we(R[l],i)}function Ir(l,i){l.fill=ee(l.fill||null),l.dir=le(l.dir,-1),i=i??R.length,R.splice(i,0,l)}function Wr(l){l==null?R.length=0:R.splice(l,1)}s.addBand=Ir,s.setBand=Hr,s.delBand=Wr;function Br(l,i){v[l].alpha=i,B.show&&Ie[l]&&(Ie[l].style.opacity=i),De&&st[l]&&(st[l].style.opacity=i)}let rl,zl,ol,Ht={focus:!0};function Yr(l){if(l!=ol){let i=l==null,o=kl.alpha!=1;v.forEach((a,h)=>{let p=i||h==0||h==l;a._focus=i?null:p,o&&Br(h,p?1:kl.alpha)}),ol=l,o&&xt()}}De&&Ml&&Ct(qs,Je,l=>{B._lock||ol!=null&&rt(null,Ht,!0,Ae.setSeries)});function at(l,i,o){let a=D[i];o&&(l=l/te-(a.ori==1?_e:pe));let h=G;a.ori==1&&(h=j,l=h-l),a.dir==-1&&(l=h-l);let p=a._min,S=a._max,b=l/h,T=p+(S-p)*b,V=a.distr;return V==3?_t(10,T):V==4?Fo(T,a.asinh):T}function Gr(l,i){let o=at(l,A,i);return vt(o,t[0],Ce,Ee)}s.valToIdx=l=>vt(l,t[0]),s.posToIdx=Gr,s.posToVal=at,s.valToPos=(l,i,o)=>D[i].ori==0?c(l,D[i],o?tt:G,o?ye:0):m(l,D[i],o?yt:j,o?He:0);function qr(l){l(s),xt()}s.batch=qr,s.setCursor=(l,i,o)=>{fe=l.left,he=l.top,gt(null,i,o)};function vs(l,i){ce(il,Yt,Xe.left=l),ce(il,pl,Xe.width=i)}function _s(l,i){ce(il,hl,Xe.top=l),ce(il,ml,Xe.height=i)}let al=P.ori==0?vs:_s,ul=P.ori==1?vs:_s;function Ur(){if(De&&I.live)for(let l=r==2?1:0;l{(h>0||!Ze)&&bs(h,o)})}De&&I.live&&Ur(),it=!1,i!==!1&&Pe("setLegend")}s.setLegend=ys;function bs(l,i){let o;if(i==null)o=ot;else{let a=v[l],h=l==0&&U==2?lt:t[l];o=Ze?a.values(s,l,i):{_:a.value(s,h[i],l,i)}}I.values[l]=o}function gt(l,i,o){ws=fe,Ss=he,[fe,he]=B.move(s,fe,he),B.show&&(Al&&Gt(Al,Me(fe),0,G,j),Ll&&Gt(Ll,0,Me(he),G,j));let a,h=Ce>Ee;rl=Q;let p=P.ori==0?G:j,S=P.ori==1?G:j;if(fe<0||be==0||h){a=null;for(let b=0;b0&&Ie.length>1&&Gt(Ie[b],-10,-10,G,j);if(Ml&&rt(null,Ht,!0,l==null&&Ae.setSeries),I.live){H.fill(null),it=!0;for(let b=0;b0&&z.show){let se=ae==null?-10:Pt(Z(ae,r==1?D[z.scale]:D[z.facets[1].scale],S,0),.5);if(se>0&&r==1){let ue=Ye(se-he);ue<=rl&&(rl=ue,zl=k)}let ge,We;if(P.ori==0?(ge=J,We=se):(ge=se,We=J),it&&Ie.length>1){Co(Ie[k],B.points.fill(s,k),B.points.stroke(s,k));let ue,Ve,Be,Oe,Ue=!0,wt=B.points.bbox;if(wt!=null){Ue=!1;let St=wt(s,k);Be=St.left,Oe=St.top,ue=St.width,Ve=St.height}else Be=ge,Oe=We,ue=Ve=B.points.size(s,k);Eo(Ie[k],ue,Ve,Ue),Gt(Ie[k],Be,Oe,G,j)}}if(I.live){if(!it||k==0&&Ze)continue;bs(k,K)}}}if(B.idx=a,B.left=fe,B.top=he,it&&(I.idx=a,ys()),Xe.show&&kt)if(l!=null){let[b,T]=Ae.scales,[V,k]=Ae.match,[z,q]=l.cursor.sync.scales,me=l.cursor.drag;if(xe=me._x,ke=me._y,xe||ke){let{left:K,top:ae,width:J,height:se}=l.select,ge=l.scales[b].ori,We=l.posToVal,ue,Ve,Be,Oe,Ue,wt=b!=null&&V(b,z),St=T!=null&&k(T,q);wt&&xe?(ge==0?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[b],Oe=re(We(ue,z),Be,p,0),Ue=re(We(ue+Ve,z),Be,p,0),al(Ge(Oe,Ue),Ye(Ue-Oe))):al(0,p),St&&ke?(ge==1?(ue=K,Ve=J):(ue=ae,Ve=se),Be=D[T],Oe=Z(We(ue,q),Be,S,0),Ue=Z(We(ue+Ve,q),Be,S,0),ul(Ge(Oe,Ue),Ye(Ue-Oe))):ul(0,S)}else Tn()}else{let b=Ye(ws-ms),T=Ye(Ss-gs);if(P.ori==1){let q=b;b=T,T=q}xe=ze.x&&b>=ze.dist,ke=ze.y&&T>=ze.dist;let V=ze.uni;V!=null?xe&&ke&&(xe=b>=V,ke=T>=V,!xe&&!ke&&(T>b?ke=!0:xe=!0)):ze.x&&ze.y&&(xe||ke)&&(xe=ke=!0);let k,z;xe&&(P.ori==0?(k=nl,z=fe):(k=sl,z=he),al(Ge(k,z),Ye(z-k)),ke||ul(0,S)),ke&&(P.ori==1?(k=nl,z=fe):(k=sl,z=he),ul(Ge(k,z),Ye(z-k)),xe||al(0,p)),!xe&&!ke&&(al(0,0),ul(0,0))}if(ze._x=xe,ze._y=ke,l==null){if(o){if(Cs!=null){let[b,T]=Ae.scales;Ae.values[0]=b!=null?at(P.ori==0?fe:he,b):null,Ae.values[1]=T!=null?at(P.ori==1?fe:he,T):null}cl(Bs,s,fe,he,G,j,a)}if(Ml){let b=o&&Ae.setSeries,T=kl.prox;ol==null?rl<=T&&rt(zl,Ht,!0,b):rl>T?rt(null,Ht,!0,b):zl!=ol&&rt(zl,Ht,!0,b)}}g&&i!==!1&&Pe("setCursor")}let It=null;function Vl(l){l===!0?It=null:(It=M.getBoundingClientRect(),Pe("syncRect",It))}function xs(l,i,o,a,h,p,S){B._lock||(Mn(l,i,o,a,h,p,S,!1,l!=null),l!=null?gt(null,!0,!0):gt(i,!0,!1))}function Mn(l,i,o,a,h,p,S,b,T){if(It==null&&Vl(!1),l!=null)o=l.clientX-It.left,a=l.clientY-It.top;else{if(o<0||a<0){fe=-10,he=-10;return}let[V,k]=Ae.scales,z=i.cursor.sync,[q,me]=z.values,[K,ae]=z.scales,[J,se]=Ae.match,ge=i.axes[0].side%2==1,We=P.ori==0?G:j,ue=P.ori==1?G:j,Ve=ge?p:h,Be=ge?h:p,Oe=ge?a:o,Ue=ge?o:a;if(K!=null?o=J(V,K)?d(q,D[V],We,0):-10:o=We*(Oe/Ve),ae!=null?a=se(k,ae)?d(me,D[k],ue,0):-10:a=ue*(Ue/Be),P.ori==1){let wt=o;o=a,a=wt}}T&&((o<=1||o>=G-1)&&(o=Mt(o,G)),(a<=1||a>=j-1)&&(a=Mt(a,j))),b?(ms=o,gs=a,[nl,sl]=B.move(s,o,a)):(fe=o,he=a)}let $r={width:0,height:0};function Tn(){Rl($r,!1)}function ks(l,i,o,a,h,p,S){kt=!0,xe=ke=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!0,!1),l!=null&&(Qe(An,Nn,Ms),cl(Ys,s,nl,sl,G,j,null))}function Ms(l,i,o,a,h,p,S){kt=ze._x=ze._y=!1,Mn(l,i,o,a,h,p,S,!1,!0);let{left:b,top:T,width:V,height:k}=Xe,z=V>0||k>0;if(z&&Rl(Xe),ze.setScale&&z){let q=b,me=V,K=T,ae=k;if(P.ori==1&&(q=T,me=k,K=b,ae=V),xe&&Ot(A,at(q,A),at(q+me,A)),ke)for(let J in D){let se=D[J];J!=A&&se.from==null&&se.min!=Q&&Ot(J,at(K+ae,J),at(K,J))}Tn()}else B.lock&&(B._lock=!B._lock,B._lock||gt(null,!0,!1));l!=null&&(ne(An,Nn),cl(An,s,fe,he,G,j,null))}function Kr(l,i,o,a,h,p,S){if(!B._lock){let b=kt;if(kt){let T=!0,V=!0,k=10,z,q;P.ori==0?(z=xe,q=ke):(z=ke,q=xe),z&&q&&(T=fe<=k||fe>=G-k,V=he<=k||he>=j-k),z&&T&&(fe=fe{rt(o,a,!0,!1)},B.show&&(Qe(Ys,M,ks),Qe(Bs,M,xs),Qe(Gs,M,Vl),Qe(qs,M,Kr),Qe(Us,M,Ts),Bn.add(s),s.syncRect=Vl);let Fl=s.hooks=e.hooks||{};function Pe(l,i,o){l in Fl&&Fl[l].forEach(a=>{a.call(null,s,i,o)})}(e.plugins||[]).forEach(l=>{for(let i in l.hooks)Fl[i]=(Fl[i]||[]).concat(l.hooks[i])});let Ae=we({key:null,setSeries:!1,filters:{pub:li,sub:li},scales:[A,v[1]?v[1].scale:null],match:[ni,ni],values:[null,null]},B.sync);B.sync=Ae;let Cs=Ae.key,Dn=Yi(Cs);function cl(l,i,o,a,h,p,S){Ae.filters.pub(l,i,o,a,h,p,S)&&Dn.pub(l,i,o,a,h,p,S)}Dn.sub(s);function jr(l,i,o,a,h,p,S){Ae.filters.sub(l,i,o,a,h,p,S)&&Wt[l](null,i,o,a,h,p,S)}s.pub=jr;function Jr(){Dn.unsub(s),Bn.delete(s),pt.clear(),In(Yl,Ut,Ds),_.remove(),Pe("destroy")}s.destroy=Jr;function Cn(){Pe("init",e,t),us(t||e.data,!1),F[A]?bn(A,F[A]):cn(),un(e.width,e.height),gt(null,!0,!1),Rl(Xe,!1)}return v.forEach(os),C.forEach(Cr),n?n instanceof HTMLElement?(n.appendChild(_),Cn()):n(s,Cn):Cn(),s}Se.assign=we;Se.fmtNum=$n;Se.rangeNum=Gl;Se.rangeLog=$l;Se.rangeAsinh=qn;Se.orient=Rt;Se.pxRatio=te;Se.join=qo;Se.fmtDate=jn,Se.tzDate=Xo;Se.sync=Yi;{Se.addGap=Ha,Se.clipGaps=Zl;let e=Se.paths={points:ji};e.linear=Zi,e.stepped=Ba,e.bars=Ya,e.spline=qa}var lu=(e,t,n)=>su(e-t,n)+t,nu=(e,t)=>e-t;function su(e,t){return Math.floor(e/t)*t}function iu(e,t){let n=[...e.values()];t&&n.sort((f,c)=>t(f.value,c.value));let s=Array(n.length),r=Array(n.length);for(let f=0;f+e,tn=class{constructor(t,n){this.chart=t,this.datasets=new Map,this.options=n,this.bucketSize=lr(n),this.histOffset=0}handleMeasurements(t){t.forEach(({y:n})=>{if(n==null)return;n=lu(n,this.histOffset,this.bucketSize);let s=this.datasets.get(n);s?s.count++:this.datasets.set(n,{value:n,count:1})}),this.chart.setData(iu(this.datasets,nu))}static initialData(){return[[],[]]}static getConfig(t){let n=lr(t),s=Se.paths.bars({align:1,size:[1,1/0],gap:4});return{title:t.title,width:t.width,height:t.height,scales:{x:{time:!1,auto:!1,dir:1,range:r=>[r.data[0][0],r.data[0][r.data[0].length-1]+n]}},axes:[{incrs:()=>[0,1,2,3,4,5,6,7,8,9,10].map(r=>r*n),splits:(r,f,c,m,d,g)=>{let _=r.axes[f]._space,y=r.valToPos(r.data[0][0]+n,"x")-r.valToPos(r.data[0][0],"x"),u=r.data[0][0],w=r.data[0][r.data[0].length-1]+n,x=[],M=Math.ceil(_/y);for(let L=0,N=u;N<=w;L++,N+=n)!(L%M)&&x.push(N);return x}}],series:[{label:t.label,value:(r,f)=>f+`-${f+n} ${t.unit}`},{paths:s,points:{show:!1},...Ol.at(1),width:2,label:"Events"}]}}};var ru=e=>e.unit?{value:(t,n)=>n==null?"--":n.toFixed(3)+` ${e.unit}`}:{},sr=e=>({value:"{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}"}),ou=e=>e.unit?{values:(t,n,s)=>n.map(r=>+r.toFixed(2)+` ${e.unit}`)}:{},ir=e=>({space:55,values:[[3600*24*365,"{YYYY}",null,null,null,null,null,null,1],[3600*24*28,"{MMM}",` {YYYY}`,null,null,null,null,null,1],[3600*24,"{M}/{D}",` {YYYY}`,null,null,null,null,null,1],[3600,"{h}{aa}",` {M}/{D}/{YY}`,null,` @@ -12,6 +12,6 @@ {h}:{mm}{aa}`,null,1],[.001,":{ss}.{fff}",` {M}/{D}/{YY} {h}:{mm}{aa}`,null,` {M}/{D} {h}:{mm}{aa}`,null,` -{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=ku(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=xu(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function ku(e){return btoa(unescape(encodeURIComponent(e)))}function xu(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr};window.customHooks=window.customHooks||{};var Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:{...Tu,...window.customHooks},params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})(); +{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=xu(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=ku(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function xu(e){return btoa(unescape(encodeURIComponent(e)))}function ku(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr},Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:{...Tu,...window.LiveDashboard.customHooks},params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})(); /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT */ diff --git a/dist/js/app.js.map b/dist/js/app.js.map index ff4a9870..72e3ccd8 100644 --- a/dist/js/app.js.map +++ b/dist/js/app.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../assets/node_modules/nprogress/nprogress.js", "../../assets/js/app.js", "../../assets/js/metrics_live/color_wheel.js", "../../assets/node_modules/uplot/dist/uPlot.esm.js", "../../assets/js/metrics_live/histogram.js", "../../assets/js/metrics_live/index.js", "../../assets/js/request_logger_cookie/index.js", "../../assets/js/request_logger_query_parameter/index.js", "../../assets/js/request_logger_messages/index.js", "../../assets/js/color_bar_highlight/index.js", "../../assets/js/refresh/index.js", "../../assets/js/remember_refresh/index.js"], - "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: '
'\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nwindow.customHooks = window.customHooks || {}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: { ...Hooks, ...window.customHooks },\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"], - "mappings": "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", + "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: '
'\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: { ...Hooks, ...window.LiveDashboard.customHooks },\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"], + "mappings": "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", "names": [] } diff --git a/lib/phoenix/live_dashboard/layouts/dash.html.heex b/lib/phoenix/live_dashboard/layouts/dash.html.heex index 35c0b663..aa61160d 100644 --- a/lib/phoenix/live_dashboard/layouts/dash.html.heex +++ b/lib/phoenix/live_dashboard/layouts/dash.html.heex @@ -1,6 +1,14 @@ + <%= custom_head_tags(assigns, :after_opening_head_tag) %> diff --git a/lib/phoenix/live_dashboard/page_builder.ex b/lib/phoenix/live_dashboard/page_builder.ex index a8fa9d37..611d74f6 100644 --- a/lib/phoenix/live_dashboard/page_builder.ex +++ b/lib/phoenix/live_dashboard/page_builder.ex @@ -125,15 +125,14 @@ defmodule Phoenix.LiveDashboard.PageBuilder do defp after_opening_head_tag(assigns) do ~H\"\"\" - \"\"\" end @@ -156,23 +155,34 @@ defmodule Phoenix.LiveDashboard.PageBuilder do ] ``` - The LiveDashboard will merge the `window.customHooks` object into the hooks that are - configured on the LiveSocket. - - > #### Warning {: .warning} - > - > If you are building a library that will be used by others, ensure that you are - > not overwriting the `window.customHooks` object instead of extending it. - > - > Instead of `window.customHooks = {...}`, - > use `window.customHooks = {...(window.customHooks || {}), ...}`. + The LiveDashboard provides a function `window.LiveDashboard.registerCustomHooks({ ... })` that you can call + with an object of hook declarations. Note that in order to use external libraries, you will either need to include them from - a CDN, or bundle them yourself and include them from your apps static paths. + a CDN, or bundle them yourself and include them from your app's static paths. - Also, you are responsible for ensuring that your Content Security Policy (CSP) allows - the hooks to be executed. If you are building a library that will be used by others, - consider including a valid nonce on your script tags. + > #### A note on CSPs and libraries {: .info} + > + > Phoenix LiveDashboard supports CSP nonces for its own assets, configurable using the + > `Phoenix.LiveDashboard.Router.live_dashboard/2` macro by setting the `:csp_nonce_assign_key` + > option. If you are building a library, ensure that you render those CSP nonces on any scripts, + > styles or images of your page. The nonces are passed to your custom page under the `:csp_nonces` assign + > and also available in the `after_opening_head_tag` component. + > + > You should use those when including scripts or styles like this: + > + > ```heex + > + > + > + > + > ``` + > + > This ensures that your custom page can be used when a CSP is in place using the mechanism + > supported by Phoenix LiveDashboard. + > + > If your custom page needs a different CSP policy, for example due to inline styles set by scripts, + > please consider documenting these requirements. """ use Phoenix.Component diff --git a/mix.exs b/mix.exs index 6c39e046..68b0d015 100644 --- a/mix.exs +++ b/mix.exs @@ -65,6 +65,7 @@ defmodule Phoenix.LiveDashboard.MixProject do {:stream_data, "~> 0.1", only: :test}, {:ecto_sqlite3, "~> 0.9.1", only: [:dev, :test]}, {:ex_doc, "~> 0.21", only: :docs}, + {:makeup_eex, ">= 0.1.1", only: :docs}, {:esbuild, "~> 0.5", only: :dev}, {:dart_sass, "~> 0.7", only: :dev} ] diff --git a/mix.lock b/mix.lock index 726a55ad..8e9f4b4d 100644 --- a/mix.lock +++ b/mix.lock @@ -22,9 +22,11 @@ "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, - "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_eex": {:hex, :makeup_eex, "1.0.0", "436d4c00204c250b17a775d64e197798aaf374627e6a4f2d3fd3074a8db61db4", [:mix], [{:makeup, "~> 1.2.1 or ~> 1.3", [hex: :makeup, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.1.0 or ~> 1.0", [hex: :makeup_html, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "3bb699bc519e4f509f1bf8a2e0ba0e08429edf3580053cd31a4f9c1bc5da86c8"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.0", "74bb8348c9b3a51d5c589bf5aebb0466a84b33274150e3b6ece1da45584afc82", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49159b7d7d999e836bedaf09dcf35ca18b312230cf901b725a64f3f42e407983"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"}, + "makeup_html": {:hex, :makeup_html, "0.1.2", "19d4050c0978a4f1618ffe43054c0049f91fe5feeb9ae8d845b5dc79c6008ae5", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b7fb9afedd617d167e6644a0430e49c1279764bfd3153da716d4d2459b0998c5"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, "myxql": {:hex, :myxql, "0.6.3", "3d77683a09f1227abb8b73d66b275262235c5cae68182f0cfa5897d72a03700e", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:geo, "~> 3.4", [hex: :geo, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "af9eb517ddaced5c5c28e8749015493757fd4413f2cfccea449c466d405d9f51"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},