From b118f613d3baa559f9a49e4703969d1366867c40 Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Mon, 27 Jul 2026 17:02:10 +0800 Subject: [PATCH] fix: preserve manually resized announcement height --- frontend-dist/css/183.49a29035.css.gz | Bin 11848 -> 0 bytes .../{183.49a29035.css => 719.172d8277.css} | 2 +- frontend-dist/css/719.172d8277.css.gz | Bin 0 -> 11848 bytes frontend-dist/index.html | 2 +- frontend-dist/index.html.gz | Bin 545 -> 545 bytes frontend-dist/js/183.37299d64.js | 23 ------------------ frontend-dist/js/183.37299d64.js.gz | Bin 106553 -> 0 bytes frontend-dist/js/183.37299d64.js.map | 1 - frontend-dist/js/183.37299d64.js.map.gz | Bin 365171 -> 0 bytes frontend-dist/js/719.b7883017.js | 23 ++++++++++++++++++ frontend-dist/js/719.b7883017.js.gz | Bin 0 -> 107055 bytes frontend-dist/js/719.b7883017.js.map | 1 + frontend-dist/js/719.b7883017.js.map.gz | Bin 0 -> 366178 bytes .../js/{app.ae8d51dc.js => app.4cfd3d69.js} | 4 +-- frontend-dist/js/app.4cfd3d69.js.gz | Bin 0 -> 25170 bytes ...pp.ae8d51dc.js.map => app.4cfd3d69.js.map} | 2 +- frontend-dist/js/app.4cfd3d69.js.map.gz | Bin 0 -> 18375 bytes frontend-dist/js/app.ae8d51dc.js.gz | Bin 25173 -> 0 bytes frontend-dist/js/app.ae8d51dc.js.map.gz | Bin 18379 -> 0 bytes 19 files changed, 29 insertions(+), 29 deletions(-) delete mode 100644 frontend-dist/css/183.49a29035.css.gz rename frontend-dist/css/{183.49a29035.css => 719.172d8277.css} (98%) create mode 100644 frontend-dist/css/719.172d8277.css.gz delete mode 100644 frontend-dist/js/183.37299d64.js delete mode 100644 frontend-dist/js/183.37299d64.js.gz delete mode 100644 frontend-dist/js/183.37299d64.js.map delete mode 100644 frontend-dist/js/183.37299d64.js.map.gz create mode 100644 frontend-dist/js/719.b7883017.js create mode 100644 frontend-dist/js/719.b7883017.js.gz create mode 100644 frontend-dist/js/719.b7883017.js.map create mode 100644 frontend-dist/js/719.b7883017.js.map.gz rename frontend-dist/js/{app.ae8d51dc.js => app.4cfd3d69.js} (99%) create mode 100644 frontend-dist/js/app.4cfd3d69.js.gz rename frontend-dist/js/{app.ae8d51dc.js.map => app.4cfd3d69.js.map} (99%) create mode 100644 frontend-dist/js/app.4cfd3d69.js.map.gz delete mode 100644 frontend-dist/js/app.ae8d51dc.js.gz delete mode 100644 frontend-dist/js/app.ae8d51dc.js.map.gz diff --git a/frontend-dist/css/183.49a29035.css.gz b/frontend-dist/css/183.49a29035.css.gz deleted file mode 100644 index 32b1dc0f093604e9ec22304dcac1ccab78ea21db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11848 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 Ck0=ZP diff --git a/frontend-dist/css/183.49a29035.css b/frontend-dist/css/719.172d8277.css similarity index 98% rename from frontend-dist/css/183.49a29035.css rename to frontend-dist/css/719.172d8277.css index 1218e98e..5565a213 100644 --- a/frontend-dist/css/183.49a29035.css +++ b/frontend-dist/css/719.172d8277.css @@ -1 +1 @@ -.sidebar-container[data-v-5cddfe48]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;background:var(--glass-bg);backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);border:1px solid var(--glass-border);border-radius:16px;box-shadow:none;transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-5cddfe48]{width:56px}html.dark .sidebar-container[data-v-5cddfe48]{background:var(--glass-bg);box-shadow:none}.sidebar-container[data-v-5cddfe48]:hover,html.dark .sidebar-container[data-v-5cddfe48]:hover{box-shadow:none}.menu-list[data-v-5cddfe48]{padding:8px}.menu-item[data-v-5cddfe48]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 6%,transparent)}html.dark .menu-item[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 10%,transparent)}.menu-item.is-active[data-v-5cddfe48]{background:color-mix(in srgb,var(--primary-color) 20%,transparent);color:var(--primary-color)}html.dark .menu-item.is-active[data-v-5cddfe48]{background:color-mix(in srgb,var(--primary-color) 30%,transparent);color:var(--el-text-color-primary)}.menu-icon[data-v-5cddfe48]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-5cddfe48]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-5cddfe48]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-5cddfe48]{padding:12px;text-align:center;cursor:pointer;transition:all .2s ease;color:var(--admin-container-color,#333)}.toggle-button[data-v-5cddfe48],html.dark .toggle-button[data-v-5cddfe48]{border-top:1px solid color-mix(in srgb,var(--el-text-color-primary) 8%,transparent)}.toggle-button[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}html.dark .toggle-button[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 6%,transparent)}@media (max-width:768px){.sidebar-container[data-v-5cddfe48]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-5cddfe48]{width:50px}.menu-icon[data-v-5cddfe48]{width:34px;min-width:34px}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.date-range-calendar[data-v-5fbe496c]{--calendar-day-size:38px;width:min(336px,100%);max-width:100%;min-width:0;box-sizing:border-box;color:var(--admin-container-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.selected-range[data-v-5fbe496c]{margin-bottom:16px}.selected-range-inputs[data-v-5fbe496c]{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px}.date-input[data-v-5fbe496c]{width:100%;min-width:0;height:34px;box-sizing:border-box;border:1px solid var(--glass-border);border-radius:8px;padding:0 8px;background:var(--glass-bg);color:var(--admin-container-color);font-size:13px;text-align:center;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.date-input[data-v-5fbe496c]:focus,.date-input[data-v-5fbe496c]:hover{border-color:var(--el-color-primary);box-shadow:none}.date-range-separator[data-v-5fbe496c]{color:var(--el-text-color-secondary);font-size:12px;font-weight:700}.calendar-header[data-v-5fbe496c]{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;margin-bottom:14px}.calendar-title[data-v-5fbe496c]{text-align:center;font-size:16px;font-weight:700}.calendar-nav[data-v-5fbe496c]{width:36px;height:36px;border:1px solid var(--glass-border);border-radius:50%;background:var(--glass-bg);color:var(--admin-container-color);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.calendar-nav[data-v-5fbe496c]:focus,.calendar-nav[data-v-5fbe496c]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:color-mix(in srgb,var(--primary-color) 8%,transparent);box-shadow:none}.calendar-grid[data-v-5fbe496c],.calendar-weekdays[data-v-5fbe496c]{display:grid;grid-template-columns:repeat(7,1fr)}.calendar-weekdays[data-v-5fbe496c]{margin-bottom:8px;color:var(--el-text-color-secondary);font-size:12px;font-weight:600;text-align:center}.calendar-weekdays span[data-v-5fbe496c]{height:24px;line-height:24px}.calendar-grid[data-v-5fbe496c]{gap:4px}.calendar-day[data-v-5fbe496c]{position:relative;width:var(--calendar-day-size);height:var(--calendar-day-size);box-sizing:border-box;justify-self:center;padding:0;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--admin-container-color);font-size:14px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .18s ease,background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.calendar-day[data-v-5fbe496c]:focus,.calendar-day[data-v-5fbe496c]:hover{border-color:color-mix(in srgb,var(--primary-color) 45%,transparent);background:color-mix(in srgb,var(--primary-color) 10%,transparent);color:var(--el-color-primary)}.calendar-day.is-muted[data-v-5fbe496c]{color:var(--el-text-color-placeholder);opacity:.62}.calendar-day.is-today[data-v-5fbe496c]{border-color:rgba(249,115,22,.7)}.calendar-day.is-in-range[data-v-5fbe496c]{border-radius:12px;background:color-mix(in srgb,var(--primary-color) 12%,transparent);color:var(--el-color-primary)}.calendar-day.is-range-end[data-v-5fbe496c],.calendar-day.is-range-start[data-v-5fbe496c]{background:var(--el-color-primary);border-color:var(--el-color-primary);color:#fff;box-shadow:none}html.dark .calendar-day.is-muted[data-v-5fbe496c]{color:var(--el-text-color-placeholder)}@media (max-width:768px){.date-range-calendar[data-v-5fbe496c]{--calendar-day-size:clamp(30px,8.5vw,38px)}}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.status-panel[data-v-0f8731a4]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.card-icon[data-v-0f8731a4]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:var(--primary-color);color:var(--el-color-white)}.card-content[data-v-0f8731a4]{flex:1}.card-title[data-v-0f8731a4]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-0f8731a4]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-0f8731a4]{font-size:11px;color:var(--el-text-color-secondary);margin-top:4px;opacity:.8}.charts-section[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-bottom:30px;overflow:visible}@media (max-width:768px){.charts-section[data-v-0f8731a4]{grid-template-columns:1fr}}.chart-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.chart-card[data-v-0f8731a4],.chart-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.chart-card[data-v-0f8731a4],.chart-content[data-v-0f8731a4],.pie-chart-container[data-v-0f8731a4],.pie-chart-wrapper[data-v-0f8731a4]{overflow:visible}.chart-header[data-v-0f8731a4]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.trend-chart-card[data-v-0f8731a4]{grid-column:1/-1}.trend-chart-header[data-v-0f8731a4]{justify-content:space-between;gap:14px;flex-wrap:wrap}.chart-title[data-v-0f8731a4]{display:flex;align-items:center;gap:8px}.trend-controls[data-v-0f8731a4]{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}.trend-calendar-btn[data-v-0f8731a4]{width:32px;min-width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;color:var(--admin-container-color);background:var(--glass-bg);border:1px solid var(--glass-border)}.trend-calendar-btn[data-v-0f8731a4]:hover{color:var(--el-color-primary);border-color:var(--glass-border);background:var(--glass-bg);box-shadow:none}.trend-date-dialog[data-v-0f8731a4]{overflow:visible;max-width:calc(100vw - 32px);box-sizing:border-box}.trend-date-dialog[data-v-0f8731a4] .el-dialog__body{overflow:visible;padding:16px 24px 24px}.trend-date-panel[data-v-0f8731a4]{width:100%;max-width:100%;min-width:0;box-sizing:border-box;display:flex;justify-content:center;overflow:hidden}.trend-group-switch[data-v-0f8731a4]{flex-shrink:0;height:32px;display:flex}.trend-group-switch[data-v-0f8731a4] .el-radio-button__inner{height:32px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0 14px}.chart-content.trend-chart-content[data-v-0f8731a4]{min-height:320px;padding:0;margin:0;min-width:0;max-width:100%;overflow:hidden}.line-chart-wrapper[data-v-0f8731a4]{position:relative;width:100%;max-width:100%;min-width:0;height:320px;overflow:hidden}.line-chart-wrapper[data-v-0f8731a4] canvas{display:block;width:100%!important;max-width:100%!important}.trend-empty-state[data-v-0f8731a4]{height:320px}.chart-content[data-v-0f8731a4]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-0f8731a4]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:var(--el-text-color-secondary);font-size:14px}.empty-state .fa-icon[data-v-0f8731a4]{font-size:32px;margin-bottom:10px}.stats-list[data-v-0f8731a4]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-0f8731a4]{display:flex;align-items:center;gap:12px}.stats-label[data-v-0f8731a4]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-0f8731a4]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-0f8731a4]{height:100%;background:var(--primary-color);border-radius:4px;transition:width .6s ease}.type-fill[data-v-0f8731a4]{background:#16a34a}.stats-value[data-v-0f8731a4]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-0f8731a4]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-0f8731a4]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-0f8731a4]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-0f8731a4]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-0f8731a4]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-0f8731a4]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-0f8731a4]{display:flex;align-items:center;gap:10px;padding:8px 12px;border:1px solid var(--glass-border);border-radius:8px}.legend-item[data-v-0f8731a4],.legend-item[data-v-0f8731a4]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 3%,transparent)}html.dark .legend-item[data-v-0f8731a4],html.dark .legend-item[data-v-0f8731a4]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)}.legend-color[data-v-0f8731a4]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-0f8731a4]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-0f8731a4]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-0f8731a4]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-0f8731a4]{margin-bottom:30px}.action-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.action-card[data-v-0f8731a4],.action-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.action-card[data-v-0f8731a4],.chart-card[data-v-0f8731a4],.overview-card[data-v-0f8731a4]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.action-header[data-v-0f8731a4]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-content[data-v-0f8731a4]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-0f8731a4]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-0f8731a4]{border-radius:10px;padding:12px 24px;margin-left:0;font-weight:500;font-size:14px;transition:background-color .2s ease,border-color .2s ease,color .2s ease;min-width:150px;width:150px;height:48px;box-shadow:none}@media (max-width:768px){.action-btn[data-v-0f8731a4]{flex:1;width:auto;min-width:0;height:auto}}.action-btn .fa-icon[data-v-0f8731a4]{margin-right:8px;font-size:14px}.rebuild-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#2563eb}.rebuild-btn[data-v-0f8731a4]:hover{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}.backup-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#16a34a}.backup-btn[data-v-0f8731a4]:hover{background:#f0fdf4;border-color:#86efac;color:#15803d}.restore-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#d97706}.restore-btn[data-v-0f8731a4]:hover{background:#fffbeb;border-color:#fcd34d;color:#b45309}.dark .rebuild-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#60a5fa}.dark .rebuild-btn[data-v-0f8731a4]:hover{background:rgba(59,130,246,.12);border-color:rgba(96,165,250,.4);color:#93c5fd}.dark .backup-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#4ade80}.dark .backup-btn[data-v-0f8731a4]:hover{background:rgba(34,197,94,.12);border-color:rgba(74,222,128,.4);color:#86efac}.dark .restore-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#fbbf24}.dark .restore-btn[data-v-0f8731a4]:hover{background:rgba(251,191,36,.12);border-color:rgba(251,191,36,.4);color:#fcd34d}.restore-section[data-v-0f8731a4]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-0f8731a4],.action-buttons>.restore-section[data-v-0f8731a4],.restore-section[data-v-0f8731a4]{flex:1;width:100%}.action-btn[data-v-0f8731a4]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-0f8731a4]{position:relative;background:var(--glass-bg);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-0f8731a4]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-0f8731a4],.card-bg-media[data-v-0f8731a4] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-0f8731a4] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-0f8731a4]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-0f8731a4]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-0f8731a4]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.5) 0,rgba(0,0,0,.2) 55%,transparent);z-index:2}.file-card-header .fa-icon[data-v-0f8731a4]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-0f8731a4]{color:#f59e0b}.info-card-footer[data-v-0f8731a4]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.55) 0,rgba(0,0,0,.25) 50%,transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-0f8731a4]{font-size:14px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.info-card-footer .file-meta[data-v-0f8731a4]{font-size:12px;color:#fafafa;text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-0f8731a4]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-0f8731a4]{height:450px}}.file-info-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.file-info-card:hover .card-bg-media[data-v-0f8731a4]{transform:scale(1)}@media (max-width:768px){.status-panel[data-v-0f8731a4]{padding:15px}.charts-section[data-v-0f8731a4],.overview-cards[data-v-0f8731a4]{grid-template-columns:1fr;gap:15px}.trend-chart-header[data-v-0f8731a4]{align-items:stretch}.chart-title[data-v-0f8731a4]{width:100%}.trend-controls[data-v-0f8731a4]{width:100%;justify-content:stretch}.trend-date-dialog[data-v-0f8731a4] .el-dialog__body{padding:12px 14px 18px}.trend-group-switch[data-v-0f8731a4]{width:100%}.trend-group-switch[data-v-0f8731a4] .el-radio-button{flex:1}.trend-group-switch[data-v-0f8731a4] .el-radio-button__inner{width:100%;padding:0 10px}.line-chart-wrapper[data-v-0f8731a4],.trend-empty-state[data-v-0f8731a4]{height:280px}.file-info-section[data-v-0f8731a4]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-0f8731a4]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-0f8731a4]{font-size:24px}.action-buttons[data-v-0f8731a4]{flex-direction:column;gap:12px}.action-btn[data-v-0f8731a4]{width:100%;min-width:unset}}.stats-fill[data-v-0f8731a4]{animation:fillAnimation-0f8731a4 1s ease-out}@keyframes fillAnimation-0f8731a4{0%{width:0}}.progress-container[data-v-0f8731a4]{width:100%;padding:20px;text-align:center}.progress-header[data-v-0f8731a4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-0f8731a4]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-0f8731a4]{font-size:18px;font-weight:700;color:var(--primary-color-accent)}.progress-bar[data-v-0f8731a4]{margin-bottom:16px}.progress-bar[data-v-0f8731a4] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-0f8731a4] .el-progress-bar__inner{background:var(--primary-color);border-radius:6px;transition:width .3s ease}.progress-details[data-v-0f8731a4]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-0f8731a4],.progress-time[data-v-0f8731a4]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-0f8731a4],.progress-time .fa-icon[data-v-0f8731a4]{color:var(--primary-color-accent);font-size:12px}.progress-message[data-v-0f8731a4]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-0f8731a4]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-0f8731a4]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);box-shadow:none}.cancel-btn .fa-icon[data-v-0f8731a4]{margin-right:8px}.error-container[data-v-0f8731a4]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-0f8731a4]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-0f8731a4]{text-align:center}.error-message[data-v-0f8731a4]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-0f8731a4]{font-size:13px;color:#666}.error-actions[data-v-0f8731a4]{display:flex;gap:12px}.error-actions .el-button[data-v-0f8731a4]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-0f8731a4]{background:var(--primary-color);border:none;color:#fff}.error-actions .el-button--primary[data-v-0f8731a4]:hover{background:var(--el-color-primary-dark-2);box-shadow:none}.error-actions .el-button--default[data-v-0f8731a4]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-0f8731a4]:hover{background:hsla(0,0%,100%,.15);border-color:var(--glass-border-hover);box-shadow:none}.error-actions .fa-icon[data-v-0f8731a4]{margin-right:8px}html.dark .progress-count[data-v-0f8731a4],html.dark .progress-time[data-v-0f8731a4]{color:#aaa}html.dark .progress-message[data-v-0f8731a4]{color:#999}html.dark .error-container[data-v-0f8731a4]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-0f8731a4]{color:#aaa}@media (max-width:768px){.error-container[data-v-0f8731a4],.progress-container[data-v-0f8731a4]{padding:16px}.progress-header[data-v-0f8731a4]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-0f8731a4]{flex-direction:column;gap:8px}.error-actions[data-v-0f8731a4]{flex-direction:column;width:100%}.error-actions .el-button[data-v-0f8731a4]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-input-number{display:inline-flex}.el-input-number{line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.channel-icon-wrapper[data-v-ce6ff2ce]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-ce6ff2ce] svg,.channel-svg-icon[data-v-ce6ff2ce]{width:1em;height:1em;fill:currentColor}.channel-icon-wrapper.channel-brand-telegram[data-v-ce6ff2ce]{color:#229ed9}.channel-icon-wrapper.channel-brand-cfr2[data-v-ce6ff2ce]{color:#f38020}.channel-icon-wrapper.channel-brand-s3[data-v-ce6ff2ce]{color:#f90}.channel-icon-wrapper.channel-brand-discord[data-v-ce6ff2ce]{color:#5865f2}.channel-icon-wrapper.channel-brand-huggingface[data-v-ce6ff2ce]{color:#ff9d00}.channel-icon-wrapper.channel-brand-webdav[data-v-ce6ff2ce]{color:#14b8a6}.custom-select[data-v-8c87e03e]{position:relative}.custom-select-trigger[data-v-8c87e03e]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:color-mix(in srgb,var(--el-fill-color-blank) 72%,transparent);border:1px solid var(--glass-border);border-radius:8px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease;box-sizing:border-box}html.dark .custom-select-trigger[data-v-8c87e03e]{background:color-mix(in srgb,var(--el-bg-color) 75%,transparent)}.custom-select-trigger[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .custom-select-trigger[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}.custom-select.is-open .custom-select-trigger[data-v-8c87e03e]{border-color:var(--el-color-primary)}.custom-select-value[data-v-8c87e03e]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-8c87e03e],.custom-select-value.is-placeholder[data-v-8c87e03e]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-8c87e03e]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-8c87e03e]{transform:rotate(180deg)}.custom-select-dropdown[data-v-8c87e03e]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:color-mix(in srgb,var(--el-fill-color-blank) 88%,transparent);border:1px solid var(--glass-border);border-radius:8px;box-shadow:none;z-index:2000;max-height:280px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}html.dark .custom-select-dropdown[data-v-8c87e03e]{background:color-mix(in srgb,var(--el-bg-color) 90%,transparent)}.custom-select-option[data-v-8c87e03e]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}html.dark .custom-select-option[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 8%,transparent);color:var(--el-text-color-primary)}.custom-select-option.is-selected[data-v-8c87e03e]{color:var(--el-color-primary);font-weight:500}html.dark .custom-select-option.is-selected[data-v-8c87e03e]{background:color-mix(in srgb,var(--primary-color) 38%,transparent);color:#fff;font-weight:600}html.dark .custom-select-option.is-selected[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--primary-color-accent) 48%,transparent);color:#fff}.option-icon[data-v-8c87e03e]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-8c87e03e],.dropdown-fade-leave-active[data-v-8c87e03e]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-8c87e03e],.dropdown-fade-leave-to[data-v-8c87e03e]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-0082a519]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-0082a519]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-0082a519]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.inline-warning-icon[data-v-0082a519]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-warning-icon[data-v-0082a519]:hover{color:var(--el-color-primary)}.inline-help-icon[data-v-0082a519]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-help-icon[data-v-0082a519]:hover{color:var(--el-color-primary)}.add-btn[data-v-0082a519]{border-radius:8px;transition:background-color .2s ease,border-color .2s ease}.header-actions[data-v-0082a519]{display:flex;gap:12px}.header-actions[data-v-0082a519] .el-button{border-radius:8px}.channel-group[data-v-0082a519]{margin-bottom:32px;background:var(--glass-bg);border-radius:16px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow)}.group-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-0082a519]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-0082a519]{font-size:20px;color:var(--el-color-primary)}.channel-count[data-v-0082a519]{font-size:12px}.load-balance-switch[data-v-0082a519]{display:flex;align-items:center;gap:8px}.switch-label[data-v-0082a519]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-0082a519]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-0082a519]{background:var(--glass-bg);border-radius:10px;border:1px solid var(--glass-border);overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:var(--glass-shadow)}.channel-card[data-v-0082a519],.channel-group[data-v-0082a519]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.card-glow[data-v-0082a519]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-0082a519]:hover{border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.channel-card.disabled[data-v-0082a519]{opacity:.6;background:var(--el-fill-color-lighter)}.card-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-0082a519]{display:flex;align-items:center;gap:8px}.channel-name[data-v-0082a519]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-0082a519]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-0082a519]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-0082a519]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-0082a519]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-0082a519]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-0082a519]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-0082a519] .el-progress{margin-bottom:4px}.quota-text[data-v-0082a519]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-0082a519]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-0082a519]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-0082a519]{font-size:32px}.channel-warning[data-v-0082a519]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.channel-type-option[data-v-0082a519]{display:inline-flex;align-items:center;gap:8px;line-height:1}.select-option-icon[data-v-0082a519]{width:16px;height:16px;font-size:16px;text-align:center}.form-warning[data-v-0082a519]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-0082a519]{width:100%}.quota-status[data-v-0082a519] .el-progress{margin-bottom:8px}.quota-info[data-v-0082a519]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border:1px solid var(--glass-border);border-radius:6px}.quota-info.quota-warning[data-v-0082a519]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-0082a519]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-0082a519]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-0082a519]{animation:fa-spin-0082a519 1s linear infinite}@keyframes fa-spin-0082a519{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-0082a519]{padding:12px}.page-header[data-v-0082a519]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-0082a519]{grid-template-columns:1fr;padding:12px}.group-header[data-v-0082a519]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-0082a519] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-0082a519] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-9cef95d2]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--primary-color);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-9cef95d2]:hover{box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-9cef95d2]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-9cef95d2]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-9cef95d2]:hover{transform:none}.floating-save-btn svg[data-v-9cef95d2]{font-size:14px}.fade-up-enter-active[data-v-9cef95d2]{transition:all .3s ease-out}.fade-up-leave-active[data-v-9cef95d2]{transition:all .2s ease-in}.fade-up-enter-from[data-v-9cef95d2]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-9cef95d2]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-9cef95d2]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-9cef95d2]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-9cef95d2]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-9cef95d2]{display:none}.floating-save-btn svg[data-v-9cef95d2]{font-size:16px}}.security-settings[data-v-06fad51f]{padding:20px;min-height:500px}.first-settings[data-v-06fad51f]{margin-bottom:40px}.first-title[data-v-06fad51f]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-06fad51f]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-06fad51f] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-06fad51f] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-06fad51f] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-06fad51f] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-06fad51f] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-06fad51f] .el-input,.first-settings[data-v-06fad51f] .el-select{width:100%}.first-settings[data-v-06fad51f] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-06fad51f]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.query-param-list[data-v-06fad51f]{display:flex;flex-direction:column;gap:10px;width:100%}.query-param-row[data-v-06fad51f]{display:grid;grid-template-columns:minmax(120px,1fr) minmax(160px,1.4fr) auto;gap:8px;align-items:center;width:100%}.response-field-row[data-v-06fad51f]{display:grid;grid-template-columns:minmax(180px,1fr) auto auto auto;gap:4px;align-items:center;width:100%}.response-field-row[data-v-06fad51f] .el-button+.el-button{margin-left:0}.token-title[data-v-06fad51f]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-06fad51f]{margin-left:5px}.token-table-container[data-v-06fad51f]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-06fad51f]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border)}.token-table[data-v-06fad51f] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-06fad51f] .el-table__body-wrapper{border-radius:0 0 12px 12px;background:transparent}.token-table[data-v-06fad51f] .el-table{border-radius:12px;background:transparent}.token-table[data-v-06fad51f] .el-table__header{background-color:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}.token-table[data-v-06fad51f] .el-table th{background-color:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)!important;border-bottom:1px solid var(--glass-border);text-align:center}.token-table[data-v-06fad51f] .el-table td{background-color:transparent!important;border-bottom:1px solid var(--glass-border)}html.dark .token-table[data-v-06fad51f] .el-table th{background-color:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)!important}html.dark .token-table[data-v-06fad51f] .el-table td{border-bottom:1px solid var(--glass-border)}.token-table[data-v-06fad51f] .el-table__row:hover td{background-color:color-mix(in srgb,var(--el-text-color-primary) 3%,transparent)!important}html.dark .token-table[data-v-06fad51f] .el-table__row:hover td{background-color:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)!important}.token-table[data-v-06fad51f] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-06fad51f]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-06fad51f]{gap:8px}.action-button[data-v-06fad51f]{margin-left:0}.permission-tag[data-v-06fad51f]{margin:2px!important}.token-display[data-v-06fad51f]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-06fad51f]{padding:15px;padding-bottom:80px}.first-settings[data-v-06fad51f] .el-form{padding:12px 15px}.first-settings[data-v-06fad51f] .el-form-item__content{max-width:100%}.query-param-row[data-v-06fad51f]{grid-template-columns:1fr}.response-field-row[data-v-06fad51f]{grid-template-columns:1fr auto auto auto}.token-table-container[data-v-06fad51f]{padding:0 10px}.table-cell-content[data-v-06fad51f]{padding:6px 2px;min-height:36px}.token-display[data-v-06fad51f]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-06fad51f]{padding:0 5px}.table-cell-content[data-v-06fad51f]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-06fad51f]{padding:4px 8px;font-size:12px}.permission-tag[data-v-06fad51f]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-06fad51f]{padding:10px 0}.token-result .el-form-item[data-v-06fad51f]{margin-bottom:20px}.dialog-footer[data-v-06fad51f]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-06fad51f],.fade-slide-leave-active[data-v-06fad51f]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-06fad51f],.fade-slide-leave-to[data-v-06fad51f]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-06fad51f],.fade-slide-leave-from[data-v-06fad51f]{opacity:1;transform:translateY(0)}[data-v-06fad51f] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);border:1px solid var(--glass-border);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-9331dab2]{padding:20px;min-height:500px}.first-settings[data-v-9331dab2]{margin-bottom:40px}.first-title[data-v-9331dab2]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-9331dab2]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-9331dab2] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.first-settings[data-v-9331dab2] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-9331dab2] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-9331dab2] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-9331dab2] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-9331dab2] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-9331dab2] .el-input,.first-settings[data-v-9331dab2] .el-select{width:100%}.first-settings[data-v-9331dab2] .el-switch{--el-switch-on-color:var(--el-color-primary)}.announcement-refresh-option[data-v-9331dab2]{width:100%;margin-top:10px;display:flex;justify-content:flex-start}.first-settings[data-v-9331dab2] .el-form-item:has(.announcement-refresh-option) .el-form-item__content{flex-direction:column;align-items:flex-start}@media (max-width:768px){.page-settings[data-v-9331dab2]{padding:15px;padding-bottom:80px}.first-settings[data-v-9331dab2] .el-form{padding:12px 15px}.first-settings[data-v-9331dab2] .el-form-item__content{max-width:100%}}.others-settings[data-v-69ae97d8]{padding:20px;min-height:500px}.first-settings[data-v-69ae97d8]{margin-bottom:40px}.first-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-69ae97d8] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-69ae97d8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-69ae97d8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-69ae97d8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-69ae97d8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-69ae97d8] .el-input{width:100%}.first-settings[data-v-69ae97d8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-69ae97d8]{padding:15px;padding-bottom:80px}.first-settings[data-v-69ae97d8] .el-form{padding:12px 15px}.first-settings[data-v-69ae97d8] .el-form-item__content{max-width:100%}}.admin-header-content[data-v-5c6339bf]{display:flex;justify-content:space-between;align-items:center;min-height:45px;padding:10px 24px;position:fixed;top:8px;left:50%;width:calc(95% - 16px);z-index:2001;border:1px solid var(--glass-border);border-radius:16px;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease}.admin-header-content[data-v-5c6339bf],.admin-header-content[data-v-5c6339bf]:hover{background:var(--glass-bg);box-shadow:none;transform:translateX(-50%)}.header-action[data-v-5c6339bf],.header-content .actions[data-v-5c6339bf]{display:flex;align-items:center}.header-action[data-v-5c6339bf]{gap:10px}.header-content .actions[data-v-5c6339bf]{gap:15px}.header-content .actions i[data-v-5c6339bf],.header-icon[data-v-5c6339bf]{font-size:1.5em;cursor:pointer;transition:color .3s ease,transform .3s ease;color:var(--admin-container-color);outline:none}.header-content .actions .el-dropdown-link i[data-v-5c6339bf]:hover,.header-content .actions i[data-v-5c6339bf]:hover,.header-icon[data-v-5c6339bf]:hover{color:var(--primary-color-accent);transform:scale(1.2)}.header-content .actions .el-dropdown-link i[data-v-5c6339bf]{color:var(--admin-container-color)}.header-content .actions .disabled[data-v-5c6339bf]{color:var(--el-text-color-disabled);pointer-events:none}.header-content .actions .enabled[data-v-5c6339bf]{color:var(--primary-color-accent)}@media (max-width:768px){.admin-header-content[data-v-5c6339bf]{flex-direction:column;top:6px;width:calc(100% - 32px);padding:6px 12px;gap:4px;border-radius:14px}.header-content .actions i[data-v-5c6339bf],.header-icon[data-v-5c6339bf]{font-size:.95em}.header-content .actions[data-v-5c6339bf]{gap:10px;margin-top:10px}}.pagination-container[data-v-5c6339bf]{display:flex;justify-content:center;align-items:center;margin-top:20px;padding-bottom:20px;gap:15px;position:relative}.pagination-center[data-v-5c6339bf]{display:flex;align-items:center;gap:10px}.pagination-container[data-v-5c6339bf] .el-pagination{--el-pagination-button-bg-color:var(--glass-bg);--el-pagination-hover-color:var(--primary-color-accent)}.pagination-container[data-v-5c6339bf] .btn-next,.pagination-container[data-v-5c6339bf] .btn-prev,.pagination-container[data-v-5c6339bf] .el-pager li{min-width:36px;height:36px;margin:0 4px;border:1px solid var(--glass-border)!important;border-radius:10px!important;background:var(--glass-bg)!important;color:var(--el-text-color-secondary);box-shadow:none;font-weight:500;line-height:36px;transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container[data-v-5c6339bf] .btn-next:hover,.pagination-container[data-v-5c6339bf] .btn-prev:hover,.pagination-container[data-v-5c6339bf] .el-pager li:hover{border-color:var(--glass-border-hover)!important;background:var(--glass-header-bg)!important;color:var(--primary-color-accent)}.pagination-container[data-v-5c6339bf] .el-pager li.is-active,.pagination-container[data-v-5c6339bf] .el-pager li.is-active:hover{border-color:var(--primary-color)!important;background:var(--primary-color)!important;color:var(--el-color-white)!important;box-shadow:none!important}.pagination-right[data-v-5c6339bf]{display:flex;align-items:center;gap:10px;position:absolute;right:0}.page-jump[data-v-5c6339bf],.page-total[data-v-5c6339bf]{color:var(--el-text-color-secondary);font-size:13px;white-space:nowrap}.page-jump[data-v-5c6339bf]{display:flex;align-items:center;gap:6px}.page-jump .jump-input[data-v-5c6339bf]{width:50px}.page-jump .jump-input[data-v-5c6339bf] .el-input__wrapper{height:28px;padding:0 8px;border:1px solid var(--glass-border);border-radius:8px;background-color:var(--glass-bg)!important;box-shadow:none;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.page-jump .jump-input[data-v-5c6339bf] .el-input__inner{height:28px;color:var(--el-text-color-primary);line-height:28px;text-align:center}.pagination-container .refresh-btn[data-v-5c6339bf]{width:36px;min-width:36px;height:36px;padding:0!important;border:1px solid var(--glass-border)!important;border-radius:10px!important;background:var(--glass-bg)!important;color:var(--primary-color-accent)!important;box-shadow:none;font-size:14px;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container .refresh-btn[data-v-5c6339bf]:hover{border-color:var(--glass-border-hover)!important;background:var(--glass-header-bg)!important;color:var(--primary-color-accent)!important;box-shadow:none}.page-jump .jump-btn[data-v-5c6339bf],.pagination-container .load-more[data-v-5c6339bf]{border-color:var(--primary-color)!important;background:var(--primary-color)!important;color:var(--el-color-white)!important;box-shadow:none;font-weight:500;transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container .load-more[data-v-5c6339bf]{height:36px;padding:0 16px!important;border-radius:10px!important}.page-jump .jump-btn[data-v-5c6339bf]{height:28px;padding:0 12px!important;border-radius:8px!important;font-size:12px;font-weight:600}.page-jump .jump-btn[data-v-5c6339bf]:hover,.pagination-container .load-more[data-v-5c6339bf]:hover{border-color:var(--el-color-primary-dark-2)!important;background:var(--el-color-primary-dark-2)!important;box-shadow:none!important}@media (max-width:768px){.pagination-container[data-v-5c6339bf]{flex-direction:column;gap:8px;margin-top:14px;padding-bottom:10px}.pagination-center[data-v-5c6339bf]{flex-wrap:wrap;justify-content:center;gap:6px;order:0}.pagination-container[data-v-5c6339bf] .el-pager li{min-width:30px;height:30px;margin:0 2px;border-radius:8px!important;font-size:12px;line-height:30px}.pagination-container[data-v-5c6339bf] .btn-next,.pagination-container[data-v-5c6339bf] .btn-prev{display:none!important;position:static!important;min-width:30px!important;width:30px!important;height:30px!important;border-radius:8px!important;font-size:12px}.pagination-right[data-v-5c6339bf]{position:static;width:100%;justify-content:center;gap:6px;order:1}.page-jump[data-v-5c6339bf],.page-total[data-v-5c6339bf]{font-size:12px}.page-jump .jump-input[data-v-5c6339bf]{width:40px}.page-jump .jump-input[data-v-5c6339bf] .el-input__wrapper{height:26px;padding:0 6px;border-radius:7px}.page-jump .jump-input[data-v-5c6339bf] .el-input__inner{height:26px;font-size:12px;line-height:26px}.pagination-container .refresh-btn[data-v-5c6339bf]{width:30px!important;min-width:30px!important;height:30px!important;border-radius:8px!important;font-size:12px!important}.pagination-container .load-more[data-v-5c6339bf]{height:30px!important;min-height:30px!important;padding:0 10px!important;border-radius:8px!important;font-size:12px!important}.page-jump .jump-btn[data-v-5c6339bf]{height:26px;padding:0 10px!important;border-radius:7px!important;font-size:11px}}.container[data-v-5c6339bf]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.main-container[data-v-5c6339bf]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-5c6339bf]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-5c6339bf],.main-container[data-v-5c6339bf]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file +.sidebar-container[data-v-5cddfe48]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;background:var(--glass-bg);backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);border:1px solid var(--glass-border);border-radius:16px;box-shadow:none;transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-5cddfe48]{width:56px}html.dark .sidebar-container[data-v-5cddfe48]{background:var(--glass-bg);box-shadow:none}.sidebar-container[data-v-5cddfe48]:hover,html.dark .sidebar-container[data-v-5cddfe48]:hover{box-shadow:none}.menu-list[data-v-5cddfe48]{padding:8px}.menu-item[data-v-5cddfe48]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 6%,transparent)}html.dark .menu-item[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 10%,transparent)}.menu-item.is-active[data-v-5cddfe48]{background:color-mix(in srgb,var(--primary-color) 20%,transparent);color:var(--primary-color)}html.dark .menu-item.is-active[data-v-5cddfe48]{background:color-mix(in srgb,var(--primary-color) 30%,transparent);color:var(--el-text-color-primary)}.menu-icon[data-v-5cddfe48]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-5cddfe48]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-5cddfe48]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-5cddfe48]{padding:12px;text-align:center;cursor:pointer;transition:all .2s ease;color:var(--admin-container-color,#333)}.toggle-button[data-v-5cddfe48],html.dark .toggle-button[data-v-5cddfe48]{border-top:1px solid color-mix(in srgb,var(--el-text-color-primary) 8%,transparent)}.toggle-button[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}html.dark .toggle-button[data-v-5cddfe48]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 6%,transparent)}@media (max-width:768px){.sidebar-container[data-v-5cddfe48]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-5cddfe48]{width:50px}.menu-icon[data-v-5cddfe48]{width:34px;min-width:34px}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.date-range-calendar[data-v-5fbe496c]{--calendar-day-size:38px;width:min(336px,100%);max-width:100%;min-width:0;box-sizing:border-box;color:var(--admin-container-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.selected-range[data-v-5fbe496c]{margin-bottom:16px}.selected-range-inputs[data-v-5fbe496c]{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px}.date-input[data-v-5fbe496c]{width:100%;min-width:0;height:34px;box-sizing:border-box;border:1px solid var(--glass-border);border-radius:8px;padding:0 8px;background:var(--glass-bg);color:var(--admin-container-color);font-size:13px;text-align:center;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.date-input[data-v-5fbe496c]:focus,.date-input[data-v-5fbe496c]:hover{border-color:var(--el-color-primary);box-shadow:none}.date-range-separator[data-v-5fbe496c]{color:var(--el-text-color-secondary);font-size:12px;font-weight:700}.calendar-header[data-v-5fbe496c]{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;margin-bottom:14px}.calendar-title[data-v-5fbe496c]{text-align:center;font-size:16px;font-weight:700}.calendar-nav[data-v-5fbe496c]{width:36px;height:36px;border:1px solid var(--glass-border);border-radius:50%;background:var(--glass-bg);color:var(--admin-container-color);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.calendar-nav[data-v-5fbe496c]:focus,.calendar-nav[data-v-5fbe496c]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:color-mix(in srgb,var(--primary-color) 8%,transparent);box-shadow:none}.calendar-grid[data-v-5fbe496c],.calendar-weekdays[data-v-5fbe496c]{display:grid;grid-template-columns:repeat(7,1fr)}.calendar-weekdays[data-v-5fbe496c]{margin-bottom:8px;color:var(--el-text-color-secondary);font-size:12px;font-weight:600;text-align:center}.calendar-weekdays span[data-v-5fbe496c]{height:24px;line-height:24px}.calendar-grid[data-v-5fbe496c]{gap:4px}.calendar-day[data-v-5fbe496c]{position:relative;width:var(--calendar-day-size);height:var(--calendar-day-size);box-sizing:border-box;justify-self:center;padding:0;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--admin-container-color);font-size:14px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .18s ease,background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.calendar-day[data-v-5fbe496c]:focus,.calendar-day[data-v-5fbe496c]:hover{border-color:color-mix(in srgb,var(--primary-color) 45%,transparent);background:color-mix(in srgb,var(--primary-color) 10%,transparent);color:var(--el-color-primary)}.calendar-day.is-muted[data-v-5fbe496c]{color:var(--el-text-color-placeholder);opacity:.62}.calendar-day.is-today[data-v-5fbe496c]{border-color:rgba(249,115,22,.7)}.calendar-day.is-in-range[data-v-5fbe496c]{border-radius:12px;background:color-mix(in srgb,var(--primary-color) 12%,transparent);color:var(--el-color-primary)}.calendar-day.is-range-end[data-v-5fbe496c],.calendar-day.is-range-start[data-v-5fbe496c]{background:var(--el-color-primary);border-color:var(--el-color-primary);color:#fff;box-shadow:none}html.dark .calendar-day.is-muted[data-v-5fbe496c]{color:var(--el-text-color-placeholder)}@media (max-width:768px){.date-range-calendar[data-v-5fbe496c]{--calendar-day-size:clamp(30px,8.5vw,38px)}}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.status-panel[data-v-0f8731a4]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.card-icon[data-v-0f8731a4]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:var(--primary-color);color:var(--el-color-white)}.card-content[data-v-0f8731a4]{flex:1}.card-title[data-v-0f8731a4]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-0f8731a4]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-0f8731a4]{font-size:11px;color:var(--el-text-color-secondary);margin-top:4px;opacity:.8}.charts-section[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-bottom:30px;overflow:visible}@media (max-width:768px){.charts-section[data-v-0f8731a4]{grid-template-columns:1fr}}.chart-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.chart-card[data-v-0f8731a4],.chart-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.chart-card[data-v-0f8731a4],.chart-content[data-v-0f8731a4],.pie-chart-container[data-v-0f8731a4],.pie-chart-wrapper[data-v-0f8731a4]{overflow:visible}.chart-header[data-v-0f8731a4]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.trend-chart-card[data-v-0f8731a4]{grid-column:1/-1}.trend-chart-header[data-v-0f8731a4]{justify-content:space-between;gap:14px;flex-wrap:wrap}.chart-title[data-v-0f8731a4]{display:flex;align-items:center;gap:8px}.trend-controls[data-v-0f8731a4]{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}.trend-calendar-btn[data-v-0f8731a4]{width:32px;min-width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;color:var(--admin-container-color);background:var(--glass-bg);border:1px solid var(--glass-border)}.trend-calendar-btn[data-v-0f8731a4]:hover{color:var(--el-color-primary);border-color:var(--glass-border);background:var(--glass-bg);box-shadow:none}.trend-date-dialog[data-v-0f8731a4]{overflow:visible;max-width:calc(100vw - 32px);box-sizing:border-box}.trend-date-dialog[data-v-0f8731a4] .el-dialog__body{overflow:visible;padding:16px 24px 24px}.trend-date-panel[data-v-0f8731a4]{width:100%;max-width:100%;min-width:0;box-sizing:border-box;display:flex;justify-content:center;overflow:hidden}.trend-group-switch[data-v-0f8731a4]{flex-shrink:0;height:32px;display:flex}.trend-group-switch[data-v-0f8731a4] .el-radio-button__inner{height:32px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0 14px}.chart-content.trend-chart-content[data-v-0f8731a4]{min-height:320px;padding:0;margin:0;min-width:0;max-width:100%;overflow:hidden}.line-chart-wrapper[data-v-0f8731a4]{position:relative;width:100%;max-width:100%;min-width:0;height:320px;overflow:hidden}.line-chart-wrapper[data-v-0f8731a4] canvas{display:block;width:100%!important;max-width:100%!important}.trend-empty-state[data-v-0f8731a4]{height:320px}.chart-content[data-v-0f8731a4]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-0f8731a4]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:var(--el-text-color-secondary);font-size:14px}.empty-state .fa-icon[data-v-0f8731a4]{font-size:32px;margin-bottom:10px}.stats-list[data-v-0f8731a4]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-0f8731a4]{display:flex;align-items:center;gap:12px}.stats-label[data-v-0f8731a4]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-0f8731a4]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-0f8731a4]{height:100%;background:var(--primary-color);border-radius:4px;transition:width .6s ease}.type-fill[data-v-0f8731a4]{background:#16a34a}.stats-value[data-v-0f8731a4]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-0f8731a4]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-0f8731a4]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-0f8731a4]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-0f8731a4]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-0f8731a4]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-0f8731a4]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-0f8731a4]{display:flex;align-items:center;gap:10px;padding:8px 12px;border:1px solid var(--glass-border);border-radius:8px}.legend-item[data-v-0f8731a4],.legend-item[data-v-0f8731a4]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 3%,transparent)}html.dark .legend-item[data-v-0f8731a4],html.dark .legend-item[data-v-0f8731a4]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)}.legend-color[data-v-0f8731a4]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-0f8731a4]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-0f8731a4]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-0f8731a4]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-0f8731a4]{margin-bottom:30px}.action-card[data-v-0f8731a4]{background:var(--glass-bg);border-radius:16px;padding:24px;border:1px solid var(--glass-border)}.action-card[data-v-0f8731a4],.action-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.action-card[data-v-0f8731a4],.chart-card[data-v-0f8731a4],.overview-card[data-v-0f8731a4]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.action-header[data-v-0f8731a4]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-content[data-v-0f8731a4]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-0f8731a4]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-0f8731a4]{border-radius:10px;padding:12px 24px;margin-left:0;font-weight:500;font-size:14px;transition:background-color .2s ease,border-color .2s ease,color .2s ease;min-width:150px;width:150px;height:48px;box-shadow:none}@media (max-width:768px){.action-btn[data-v-0f8731a4]{flex:1;width:auto;min-width:0;height:auto}}.action-btn .fa-icon[data-v-0f8731a4]{margin-right:8px;font-size:14px}.rebuild-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#2563eb}.rebuild-btn[data-v-0f8731a4]:hover{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}.backup-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#16a34a}.backup-btn[data-v-0f8731a4]:hover{background:#f0fdf4;border-color:#86efac;color:#15803d}.restore-btn[data-v-0f8731a4]{background:var(--el-fill-color-blank);border-color:var(--el-border-color-lighter);color:#d97706}.restore-btn[data-v-0f8731a4]:hover{background:#fffbeb;border-color:#fcd34d;color:#b45309}.dark .rebuild-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#60a5fa}.dark .rebuild-btn[data-v-0f8731a4]:hover{background:rgba(59,130,246,.12);border-color:rgba(96,165,250,.4);color:#93c5fd}.dark .backup-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#4ade80}.dark .backup-btn[data-v-0f8731a4]:hover{background:rgba(34,197,94,.12);border-color:rgba(74,222,128,.4);color:#86efac}.dark .restore-btn[data-v-0f8731a4]{background:var(--el-fill-color-light);border-color:var(--el-border-color-lighter);color:#fbbf24}.dark .restore-btn[data-v-0f8731a4]:hover{background:rgba(251,191,36,.12);border-color:rgba(251,191,36,.4);color:#fcd34d}.restore-section[data-v-0f8731a4]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-0f8731a4],.action-buttons>.restore-section[data-v-0f8731a4],.restore-section[data-v-0f8731a4]{flex:1;width:100%}.action-btn[data-v-0f8731a4]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-0f8731a4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-0f8731a4]{position:relative;background:var(--glass-bg);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-0f8731a4]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-0f8731a4],.card-bg-media[data-v-0f8731a4] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-0f8731a4] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-0f8731a4]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-0f8731a4]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-0f8731a4]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.5) 0,rgba(0,0,0,.2) 55%,transparent);z-index:2}.file-card-header .fa-icon[data-v-0f8731a4]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-0f8731a4]{color:#f59e0b}.info-card-footer[data-v-0f8731a4]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.55) 0,rgba(0,0,0,.25) 50%,transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-0f8731a4]{font-size:14px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.info-card-footer .file-meta[data-v-0f8731a4]{font-size:12px;color:#fafafa;text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-0f8731a4]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-0f8731a4]{height:450px}}.file-info-card[data-v-0f8731a4]:hover{box-shadow:var(--glass-shadow)}.file-info-card:hover .card-bg-media[data-v-0f8731a4]{transform:scale(1)}@media (max-width:768px){.status-panel[data-v-0f8731a4]{padding:15px}.charts-section[data-v-0f8731a4],.overview-cards[data-v-0f8731a4]{grid-template-columns:1fr;gap:15px}.trend-chart-header[data-v-0f8731a4]{align-items:stretch}.chart-title[data-v-0f8731a4]{width:100%}.trend-controls[data-v-0f8731a4]{width:100%;justify-content:stretch}.trend-date-dialog[data-v-0f8731a4] .el-dialog__body{padding:12px 14px 18px}.trend-group-switch[data-v-0f8731a4]{width:100%}.trend-group-switch[data-v-0f8731a4] .el-radio-button{flex:1}.trend-group-switch[data-v-0f8731a4] .el-radio-button__inner{width:100%;padding:0 10px}.line-chart-wrapper[data-v-0f8731a4],.trend-empty-state[data-v-0f8731a4]{height:280px}.file-info-section[data-v-0f8731a4]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-0f8731a4]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-0f8731a4]{font-size:24px}.action-buttons[data-v-0f8731a4]{flex-direction:column;gap:12px}.action-btn[data-v-0f8731a4]{width:100%;min-width:unset}}.stats-fill[data-v-0f8731a4]{animation:fillAnimation-0f8731a4 1s ease-out}@keyframes fillAnimation-0f8731a4{0%{width:0}}.progress-container[data-v-0f8731a4]{width:100%;padding:20px;text-align:center}.progress-header[data-v-0f8731a4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-0f8731a4]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-0f8731a4]{font-size:18px;font-weight:700;color:var(--primary-color-accent)}.progress-bar[data-v-0f8731a4]{margin-bottom:16px}.progress-bar[data-v-0f8731a4] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-0f8731a4] .el-progress-bar__inner{background:var(--primary-color);border-radius:6px;transition:width .3s ease}.progress-details[data-v-0f8731a4]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-0f8731a4],.progress-time[data-v-0f8731a4]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-0f8731a4],.progress-time .fa-icon[data-v-0f8731a4]{color:var(--primary-color-accent);font-size:12px}.progress-message[data-v-0f8731a4]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-0f8731a4]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-0f8731a4]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);box-shadow:none}.cancel-btn .fa-icon[data-v-0f8731a4]{margin-right:8px}.error-container[data-v-0f8731a4]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-0f8731a4]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-0f8731a4]{text-align:center}.error-message[data-v-0f8731a4]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-0f8731a4]{font-size:13px;color:#666}.error-actions[data-v-0f8731a4]{display:flex;gap:12px}.error-actions .el-button[data-v-0f8731a4]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-0f8731a4]{background:var(--primary-color);border:none;color:#fff}.error-actions .el-button--primary[data-v-0f8731a4]:hover{background:var(--el-color-primary-dark-2);box-shadow:none}.error-actions .el-button--default[data-v-0f8731a4]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-0f8731a4]:hover{background:hsla(0,0%,100%,.15);border-color:var(--glass-border-hover);box-shadow:none}.error-actions .fa-icon[data-v-0f8731a4]{margin-right:8px}html.dark .progress-count[data-v-0f8731a4],html.dark .progress-time[data-v-0f8731a4]{color:#aaa}html.dark .progress-message[data-v-0f8731a4]{color:#999}html.dark .error-container[data-v-0f8731a4]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-0f8731a4]{color:#aaa}@media (max-width:768px){.error-container[data-v-0f8731a4],.progress-container[data-v-0f8731a4]{padding:16px}.progress-header[data-v-0f8731a4]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-0f8731a4]{flex-direction:column;gap:8px}.error-actions[data-v-0f8731a4]{flex-direction:column;width:100%}.error-actions .el-button[data-v-0f8731a4]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-input-number{display:inline-flex}.el-input-number{line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.channel-icon-wrapper[data-v-ce6ff2ce]{display:inline-flex;align-items:center;justify-content:center;line-height:1}.channel-icon-wrapper[data-v-ce6ff2ce] svg,.channel-svg-icon[data-v-ce6ff2ce]{width:1em;height:1em;fill:currentColor}.channel-icon-wrapper.channel-brand-telegram[data-v-ce6ff2ce]{color:#229ed9}.channel-icon-wrapper.channel-brand-cfr2[data-v-ce6ff2ce]{color:#f38020}.channel-icon-wrapper.channel-brand-s3[data-v-ce6ff2ce]{color:#f90}.channel-icon-wrapper.channel-brand-discord[data-v-ce6ff2ce]{color:#5865f2}.channel-icon-wrapper.channel-brand-huggingface[data-v-ce6ff2ce]{color:#ff9d00}.channel-icon-wrapper.channel-brand-webdav[data-v-ce6ff2ce]{color:#14b8a6}.custom-select[data-v-8c87e03e]{position:relative}.custom-select-trigger[data-v-8c87e03e]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:color-mix(in srgb,var(--el-fill-color-blank) 72%,transparent);border:1px solid var(--glass-border);border-radius:8px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease;box-sizing:border-box}html.dark .custom-select-trigger[data-v-8c87e03e]{background:color-mix(in srgb,var(--el-bg-color) 75%,transparent)}.custom-select-trigger[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-fill-color-blank) 85%,transparent);border-color:var(--glass-border-hover)}html.dark .custom-select-trigger[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-bg-color) 88%,transparent);border-color:var(--glass-border-hover)}.custom-select.is-open .custom-select-trigger[data-v-8c87e03e]{border-color:var(--el-color-primary)}.custom-select-value[data-v-8c87e03e]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-8c87e03e],.custom-select-value.is-placeholder[data-v-8c87e03e]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-8c87e03e]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-8c87e03e]{transform:rotate(180deg)}.custom-select-dropdown[data-v-8c87e03e]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:color-mix(in srgb,var(--el-fill-color-blank) 88%,transparent);border:1px solid var(--glass-border);border-radius:8px;box-shadow:none;z-index:2000;max-height:280px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}html.dark .custom-select-dropdown[data-v-8c87e03e]{background:color-mix(in srgb,var(--el-bg-color) 90%,transparent)}.custom-select-option[data-v-8c87e03e]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}html.dark .custom-select-option[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--el-text-color-primary) 8%,transparent);color:var(--el-text-color-primary)}.custom-select-option.is-selected[data-v-8c87e03e]{color:var(--el-color-primary);font-weight:500}html.dark .custom-select-option.is-selected[data-v-8c87e03e]{background:color-mix(in srgb,var(--primary-color) 38%,transparent);color:#fff;font-weight:600}html.dark .custom-select-option.is-selected[data-v-8c87e03e]:hover{background:color-mix(in srgb,var(--primary-color-accent) 48%,transparent);color:#fff}.option-icon[data-v-8c87e03e]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-8c87e03e],.dropdown-fade-leave-active[data-v-8c87e03e]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-8c87e03e],.dropdown-fade-leave-to[data-v-8c87e03e]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-0082a519]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-0082a519]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-0082a519]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.inline-warning-icon[data-v-0082a519]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-warning-icon[data-v-0082a519]:hover{color:var(--el-color-primary)}.inline-help-icon[data-v-0082a519]{color:var(--el-text-color-secondary);cursor:pointer;font-size:13px;margin-left:6px;transition:color .2s}.inline-help-icon[data-v-0082a519]:hover{color:var(--el-color-primary)}.add-btn[data-v-0082a519]{border-radius:8px;transition:background-color .2s ease,border-color .2s ease}.header-actions[data-v-0082a519]{display:flex;gap:12px}.header-actions[data-v-0082a519] .el-button{border-radius:8px}.channel-group[data-v-0082a519]{margin-bottom:32px;background:var(--glass-bg);border-radius:16px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow)}.group-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-0082a519]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-0082a519]{font-size:20px;color:var(--el-color-primary)}.channel-count[data-v-0082a519]{font-size:12px}.load-balance-switch[data-v-0082a519]{display:flex;align-items:center;gap:8px}.switch-label[data-v-0082a519]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-0082a519]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-0082a519]{background:var(--glass-bg);border-radius:10px;border:1px solid var(--glass-border);overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:var(--glass-shadow)}.channel-card[data-v-0082a519],.channel-group[data-v-0082a519]{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.card-glow[data-v-0082a519]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-0082a519]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-0082a519]:hover{border-color:var(--glass-border);box-shadow:var(--glass-shadow)}.channel-card.disabled[data-v-0082a519]{opacity:.6;background:var(--el-fill-color-lighter)}.card-header[data-v-0082a519]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-0082a519]{display:flex;align-items:center;gap:8px}.channel-name[data-v-0082a519]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-0082a519]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-0082a519]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-0082a519]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-0082a519]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-0082a519]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-0082a519]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-0082a519] .el-progress{margin-bottom:4px}.quota-text[data-v-0082a519]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-0082a519]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-0082a519]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-0082a519]{font-size:32px}.channel-warning[data-v-0082a519]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.channel-type-option[data-v-0082a519]{display:inline-flex;align-items:center;gap:8px;line-height:1}.select-option-icon[data-v-0082a519]{width:16px;height:16px;font-size:16px;text-align:center}.form-warning[data-v-0082a519]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-0082a519]{width:100%}.quota-status[data-v-0082a519] .el-progress{margin-bottom:8px}.quota-info[data-v-0082a519]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border:1px solid var(--glass-border);border-radius:6px}.quota-info.quota-warning[data-v-0082a519]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-0082a519]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-0082a519]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-0082a519]{animation:fa-spin-0082a519 1s linear infinite}@keyframes fa-spin-0082a519{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-0082a519]{padding:12px}.page-header[data-v-0082a519]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-0082a519]{grid-template-columns:1fr;padding:12px}.group-header[data-v-0082a519]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-0082a519] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-0082a519] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-9cef95d2]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--primary-color);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-9cef95d2]:hover{box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-9cef95d2]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-9cef95d2]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-9cef95d2]:hover{transform:none}.floating-save-btn svg[data-v-9cef95d2]{font-size:14px}.fade-up-enter-active[data-v-9cef95d2]{transition:all .3s ease-out}.fade-up-leave-active[data-v-9cef95d2]{transition:all .2s ease-in}.fade-up-enter-from[data-v-9cef95d2]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-9cef95d2]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-9cef95d2]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-9cef95d2]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-9cef95d2]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-9cef95d2]{display:none}.floating-save-btn svg[data-v-9cef95d2]{font-size:16px}}.security-settings[data-v-06fad51f]{padding:20px;min-height:500px}.first-settings[data-v-06fad51f]{margin-bottom:40px}.first-title[data-v-06fad51f]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-06fad51f]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-06fad51f] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-06fad51f] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-06fad51f] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-06fad51f] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-06fad51f] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-06fad51f] .el-input,.first-settings[data-v-06fad51f] .el-select{width:100%}.first-settings[data-v-06fad51f] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-06fad51f]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.query-param-list[data-v-06fad51f]{display:flex;flex-direction:column;gap:10px;width:100%}.query-param-row[data-v-06fad51f]{display:grid;grid-template-columns:minmax(120px,1fr) minmax(160px,1.4fr) auto;gap:8px;align-items:center;width:100%}.response-field-row[data-v-06fad51f]{display:grid;grid-template-columns:minmax(180px,1fr) auto auto auto;gap:4px;align-items:center;width:100%}.response-field-row[data-v-06fad51f] .el-button+.el-button{margin-left:0}.token-title[data-v-06fad51f]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-06fad51f]{margin-left:5px}.token-table-container[data-v-06fad51f]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-06fad51f]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border:1px solid var(--glass-border)}.token-table[data-v-06fad51f] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-06fad51f] .el-table__body-wrapper{border-radius:0 0 12px 12px;background:transparent}.token-table[data-v-06fad51f] .el-table{border-radius:12px;background:transparent}.token-table[data-v-06fad51f] .el-table__header{background-color:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)}.token-table[data-v-06fad51f] .el-table th{background-color:color-mix(in srgb,var(--el-text-color-primary) 4%,transparent)!important;border-bottom:1px solid var(--glass-border);text-align:center}.token-table[data-v-06fad51f] .el-table td{background-color:transparent!important;border-bottom:1px solid var(--glass-border)}html.dark .token-table[data-v-06fad51f] .el-table th{background-color:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)!important}html.dark .token-table[data-v-06fad51f] .el-table td{border-bottom:1px solid var(--glass-border)}.token-table[data-v-06fad51f] .el-table__row:hover td{background-color:color-mix(in srgb,var(--el-text-color-primary) 3%,transparent)!important}html.dark .token-table[data-v-06fad51f] .el-table__row:hover td{background-color:color-mix(in srgb,var(--el-text-color-primary) 5%,transparent)!important}.token-table[data-v-06fad51f] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-06fad51f]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-06fad51f]{gap:8px}.action-button[data-v-06fad51f]{margin-left:0}.permission-tag[data-v-06fad51f]{margin:2px!important}.token-display[data-v-06fad51f]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-06fad51f]{padding:15px;padding-bottom:80px}.first-settings[data-v-06fad51f] .el-form{padding:12px 15px}.first-settings[data-v-06fad51f] .el-form-item__content{max-width:100%}.query-param-row[data-v-06fad51f]{grid-template-columns:1fr}.response-field-row[data-v-06fad51f]{grid-template-columns:1fr auto auto auto}.token-table-container[data-v-06fad51f]{padding:0 10px}.table-cell-content[data-v-06fad51f]{padding:6px 2px;min-height:36px}.token-display[data-v-06fad51f]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-06fad51f]{padding:0 5px}.table-cell-content[data-v-06fad51f]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-06fad51f]{padding:4px 8px;font-size:12px}.permission-tag[data-v-06fad51f]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-06fad51f]{padding:10px 0}.token-result .el-form-item[data-v-06fad51f]{margin-bottom:20px}.dialog-footer[data-v-06fad51f]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-06fad51f],.fade-slide-leave-active[data-v-06fad51f]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-06fad51f],.fade-slide-leave-to[data-v-06fad51f]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-06fad51f],.fade-slide-leave-from[data-v-06fad51f]{opacity:1;transform:translateY(0)}[data-v-06fad51f] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);border:1px solid var(--glass-border);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-7f157eca]{padding:20px;min-height:500px}.first-settings[data-v-7f157eca]{margin-bottom:40px}.first-title[data-v-7f157eca]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-7f157eca]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7f157eca] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.first-settings[data-v-7f157eca] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7f157eca] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7f157eca] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-7f157eca] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7f157eca] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-7f157eca] .el-input,.first-settings[data-v-7f157eca] .el-select{width:100%}.first-settings[data-v-7f157eca] .el-switch{--el-switch-on-color:var(--el-color-primary)}.announcement-refresh-option[data-v-7f157eca]{width:100%;margin-top:10px;display:flex;justify-content:flex-start}.first-settings[data-v-7f157eca] .el-form-item:has(.announcement-refresh-option) .el-form-item__content{flex-direction:column;align-items:flex-start}@media (max-width:768px){.page-settings[data-v-7f157eca]{padding:15px;padding-bottom:80px}.first-settings[data-v-7f157eca] .el-form{padding:12px 15px}.first-settings[data-v-7f157eca] .el-form-item__content{max-width:100%}}.others-settings[data-v-69ae97d8]{padding:20px;min-height:500px}.first-settings[data-v-69ae97d8]{margin-bottom:40px}.first-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-69ae97d8]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-69ae97d8] .el-form{padding:20px 24px;background-color:var(--glass-bg)!important;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);border-radius:16px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow)}.first-settings[data-v-69ae97d8] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-69ae97d8] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-69ae97d8] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-69ae97d8] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-69ae97d8] .el-input{width:100%}.first-settings[data-v-69ae97d8] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-69ae97d8]{padding:15px;padding-bottom:80px}.first-settings[data-v-69ae97d8] .el-form{padding:12px 15px}.first-settings[data-v-69ae97d8] .el-form-item__content{max-width:100%}}.admin-header-content[data-v-5c6339bf]{display:flex;justify-content:space-between;align-items:center;min-height:45px;padding:10px 24px;position:fixed;top:8px;left:50%;width:calc(95% - 16px);z-index:2001;border:1px solid var(--glass-border);border-radius:16px;transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease}.admin-header-content[data-v-5c6339bf],.admin-header-content[data-v-5c6339bf]:hover{background:var(--glass-bg);box-shadow:none;transform:translateX(-50%)}.header-action[data-v-5c6339bf],.header-content .actions[data-v-5c6339bf]{display:flex;align-items:center}.header-action[data-v-5c6339bf]{gap:10px}.header-content .actions[data-v-5c6339bf]{gap:15px}.header-content .actions i[data-v-5c6339bf],.header-icon[data-v-5c6339bf]{font-size:1.5em;cursor:pointer;transition:color .3s ease,transform .3s ease;color:var(--admin-container-color);outline:none}.header-content .actions .el-dropdown-link i[data-v-5c6339bf]:hover,.header-content .actions i[data-v-5c6339bf]:hover,.header-icon[data-v-5c6339bf]:hover{color:var(--primary-color-accent);transform:scale(1.2)}.header-content .actions .el-dropdown-link i[data-v-5c6339bf]{color:var(--admin-container-color)}.header-content .actions .disabled[data-v-5c6339bf]{color:var(--el-text-color-disabled);pointer-events:none}.header-content .actions .enabled[data-v-5c6339bf]{color:var(--primary-color-accent)}@media (max-width:768px){.admin-header-content[data-v-5c6339bf]{flex-direction:column;top:6px;width:calc(100% - 32px);padding:6px 12px;gap:4px;border-radius:14px}.header-content .actions i[data-v-5c6339bf],.header-icon[data-v-5c6339bf]{font-size:.95em}.header-content .actions[data-v-5c6339bf]{gap:10px;margin-top:10px}}.pagination-container[data-v-5c6339bf]{display:flex;justify-content:center;align-items:center;margin-top:20px;padding-bottom:20px;gap:15px;position:relative}.pagination-center[data-v-5c6339bf]{display:flex;align-items:center;gap:10px}.pagination-container[data-v-5c6339bf] .el-pagination{--el-pagination-button-bg-color:var(--glass-bg);--el-pagination-hover-color:var(--primary-color-accent)}.pagination-container[data-v-5c6339bf] .btn-next,.pagination-container[data-v-5c6339bf] .btn-prev,.pagination-container[data-v-5c6339bf] .el-pager li{min-width:36px;height:36px;margin:0 4px;border:1px solid var(--glass-border)!important;border-radius:10px!important;background:var(--glass-bg)!important;color:var(--el-text-color-secondary);box-shadow:none;font-weight:500;line-height:36px;transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container[data-v-5c6339bf] .btn-next:hover,.pagination-container[data-v-5c6339bf] .btn-prev:hover,.pagination-container[data-v-5c6339bf] .el-pager li:hover{border-color:var(--glass-border-hover)!important;background:var(--glass-header-bg)!important;color:var(--primary-color-accent)}.pagination-container[data-v-5c6339bf] .el-pager li.is-active,.pagination-container[data-v-5c6339bf] .el-pager li.is-active:hover{border-color:var(--primary-color)!important;background:var(--primary-color)!important;color:var(--el-color-white)!important;box-shadow:none!important}.pagination-right[data-v-5c6339bf]{display:flex;align-items:center;gap:10px;position:absolute;right:0}.page-jump[data-v-5c6339bf],.page-total[data-v-5c6339bf]{color:var(--el-text-color-secondary);font-size:13px;white-space:nowrap}.page-jump[data-v-5c6339bf]{display:flex;align-items:center;gap:6px}.page-jump .jump-input[data-v-5c6339bf]{width:50px}.page-jump .jump-input[data-v-5c6339bf] .el-input__wrapper{height:28px;padding:0 8px;border:1px solid var(--glass-border);border-radius:8px;background-color:var(--glass-bg)!important;box-shadow:none;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4)}.page-jump .jump-input[data-v-5c6339bf] .el-input__inner{height:28px;color:var(--el-text-color-primary);line-height:28px;text-align:center}.pagination-container .refresh-btn[data-v-5c6339bf]{width:36px;min-width:36px;height:36px;padding:0!important;border:1px solid var(--glass-border)!important;border-radius:10px!important;background:var(--glass-bg)!important;color:var(--primary-color-accent)!important;box-shadow:none;font-size:14px;backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container .refresh-btn[data-v-5c6339bf]:hover{border-color:var(--glass-border-hover)!important;background:var(--glass-header-bg)!important;color:var(--primary-color-accent)!important;box-shadow:none}.page-jump .jump-btn[data-v-5c6339bf],.pagination-container .load-more[data-v-5c6339bf]{border-color:var(--primary-color)!important;background:var(--primary-color)!important;color:var(--el-color-white)!important;box-shadow:none;font-weight:500;transition:background-color .25s ease,border-color .25s ease,color .25s ease}.pagination-container .load-more[data-v-5c6339bf]{height:36px;padding:0 16px!important;border-radius:10px!important}.page-jump .jump-btn[data-v-5c6339bf]{height:28px;padding:0 12px!important;border-radius:8px!important;font-size:12px;font-weight:600}.page-jump .jump-btn[data-v-5c6339bf]:hover,.pagination-container .load-more[data-v-5c6339bf]:hover{border-color:var(--el-color-primary-dark-2)!important;background:var(--el-color-primary-dark-2)!important;box-shadow:none!important}@media (max-width:768px){.pagination-container[data-v-5c6339bf]{flex-direction:column;gap:8px;margin-top:14px;padding-bottom:10px}.pagination-center[data-v-5c6339bf]{flex-wrap:wrap;justify-content:center;gap:6px;order:0}.pagination-container[data-v-5c6339bf] .el-pager li{min-width:30px;height:30px;margin:0 2px;border-radius:8px!important;font-size:12px;line-height:30px}.pagination-container[data-v-5c6339bf] .btn-next,.pagination-container[data-v-5c6339bf] .btn-prev{display:none!important;position:static!important;min-width:30px!important;width:30px!important;height:30px!important;border-radius:8px!important;font-size:12px}.pagination-right[data-v-5c6339bf]{position:static;width:100%;justify-content:center;gap:6px;order:1}.page-jump[data-v-5c6339bf],.page-total[data-v-5c6339bf]{font-size:12px}.page-jump .jump-input[data-v-5c6339bf]{width:40px}.page-jump .jump-input[data-v-5c6339bf] .el-input__wrapper{height:26px;padding:0 6px;border-radius:7px}.page-jump .jump-input[data-v-5c6339bf] .el-input__inner{height:26px;font-size:12px;line-height:26px}.pagination-container .refresh-btn[data-v-5c6339bf]{width:30px!important;min-width:30px!important;height:30px!important;border-radius:8px!important;font-size:12px!important}.pagination-container .load-more[data-v-5c6339bf]{height:30px!important;min-height:30px!important;padding:0 10px!important;border-radius:8px!important;font-size:12px!important}.page-jump .jump-btn[data-v-5c6339bf]{height:26px;padding:0 10px!important;border-radius:7px!important;font-size:11px}}.container[data-v-5c6339bf]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.main-container[data-v-5c6339bf]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-5c6339bf]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-5c6339bf],.main-container[data-v-5c6339bf]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/frontend-dist/css/719.172d8277.css.gz b/frontend-dist/css/719.172d8277.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..90cf5aa937052c1f21a6b5629018a76da0833853 GIT binary patch literal 11848 zcmV-OF1OJiiwFP!000023hjN{uIspR;IC*-V*|@+$&uyD@&ywl$WvbOl!wU#jSbqO zymYoK`AG7*wBh;o0ZCE36)DR0?(`W9I@xF0Caa1?vZ`1tR!y5c#d}mohpKE*UgG+{ zQq-d8Jz5^pG{cMaZ`U+$&IS6~W(EG-k$<8zukoSHt8#m&ip#0oovS9NpR@cEr@OW~ zZqGN%YCfXk-^ry70&QX>ZEv~ow;!?lNlJn;zXi$5pQHx(@ z)5T;Lec=6%yp6m&?5jG(^>%jt44SIQ(?CH@f8>p#8m0NA+0Isk*y=NC-cVY7Y|E;| zY|xA?bWFi?-UJvmI20}W?{?KYuCt>0*uLdyip$&7n3-wbM2D&<(7C~>IZcdj%hmbw z_ST+?X^QF}!PH}ZT})Pobn^hWeIp|YN0Gq#Tn%g|TwbCgZ(5V+GfLCEJd)MbwaZ(4 z8d$uj$d4s$*lZ8DY;nE&>!oS)?28hI%a*o_nikdVj-w!JBoP0^yEmL4-`edW;gg>K zPTF-#VqbmgtAi}%!=-MjdV8*NidR}3g8#uZ=~l?0Dyq8wxT7Dt*+J@*ppA~~V@n3oY{*;1jOjoQE%{^m<` zkdGi+;<(HpFUEi5?OSze>AHY8!T~dr(ywc@N42&Fx>Z!uMHO@7kbl+yQy%9f*^4IJ z5s=8%cjA&* zd%FE)NNJyaIfA!bMY`xBqG#6$H;WE|BplsTRKUf+d3@EGPNofN8_O1DgyHu)p@=W#1Jr3eqTY*2#sh{E|LsOSk{EZn35!L8z#Xivwawmml7BYGe z(2oq_wyvu7N;mwuI$zGwsY+21?T@fH*ca&VW3n^a_h+%`@-}_%zN8k6G@bnWybOfJ z*l+wOC4N5gM~0eq(jCuup8}(I48W=`tuL@3tLhI_r;W@;K@(wOKa3mHrnC7D=mefcOk|^bain0K~L;t3IMbQ8oCg9=r~yIJ^u& z41N`g;Dnn79Wet&1wt5*4LgDG?%Pt9-;%wuW=&M9JyK$%;{Lr{U|Wmd^PnY?_%b>6~2**-Hthj44^h4Uo@TnJS9Uxz*C z5cgpPGTDJL-=Y*$YW7w7HO|AO!#DJjiXf}17TXS&e0`Jo9~7thu}VS{ap4DC4H%6A zWBgJtVsz)I80yxIO6e#T8MA7HbUNb_w>1$@*KTV?_#KyRBP5Nzi-cG2-3wTQ(j ztD{wnbm(+FPha9NO5*cp7*B4JwLY_+#ckM#xi6u!1CY-I!!*h0l+~ghKxEQweRK+M z+UX=kEskp9(~1tLz-5ZWbw#$vi_Plr+coNci&FH(bEZP23hfcgl=j__$&mMuo|c z8Sl-JVC@d@@t9NTC^iSLP8CB)4!MxrqQP{w2I6wWmzwud{N!XTvui?U6CU;=h;g_^ zwb&SG-!=G*YSdQ1#o*^u>Xsp!=+SMzioqx!gO;E+i6ZGE`GaXLm@p9^%rZ&g863^%{0tHcD|R^WC~7)9^n zlEo&R&6Z)3gwt1mMiQa`Te{jcZKB$7zAQ{0V<9traOo7pN?RJ$3ycPEl;5Lpq{~2E zb4WpEPhAO)7_z&MWrqTt&M$LvkX%of?;jyKr%hOt7n$*j`L5}o?mHBA4D(6QB5|Ck824k-MTz=kd9L$y^G$7d6XrR%eZ}{+| zCnp+qt%Fd~ydmyW8yGk;sas2BMNH44`oO6Lfj$KzSR^rHLzyv~S-GL13HmR-e=pD; z7uVsHJsvWPnv&(05LbiH*jl@f9W%;~S6?hHZV;lk!rz| zHwD)D(q27;(}2tX19hD8p~Ee20&|e?uHfxekv;aMT@WzYnG@)a zgvPRmG@w0bh~@h-b5ii@5O+NWBW|}ncE8(b(-63qI%JaePg@-bt;UAcLbll)Zpo{} z$%06_+w$Qk9>cCT8Rhh}kL5aFhokuBwf2_y!3M?oCK0im1x z|2<37YL03r_1@r%`0IT8!NzIeEqr@=nzQ#Cmk%41uV3U#kkT zB=fU-MJW49*f(6aSfigIhlbV_@}nra&wSfo%u*dj$fbj)omg!pE(} zM$6bm4g`QOZVYsqmMYL*Vg70z$bj8zk+q>^7Hx->K@sW#*s~{MZWV>24?y;z5fV$X zhJe+=Jiwl{7$~X?Vhv{PiscD%ufG!+BYFYv=P}-5gn|^xO;0Va2i+ao82j3)B zKx$glUYh8PN?h=(-8fsn&Sz*La>^uH8Z|lYghZN%heYphw<$4r-gEpB9mpF-6RLms z5{Xcavb+tuDAi<5Zj?z#6U$OX=~4ri=JfhZA;F};nXJr6$<}j$oH~b6ff?`H7-;dX z%_I6xHS>o?W9B^r5R=e{I#trL2zId3>`H#XAD@l+k zJI6V-8(D|Z92_B)WIdp*l+aJ9jT#u$1!1gKtDPAYr=_0i0KcQ+;sl(m%?MJTm@Vay z)gfyx`{9Aid?WazCxT?~eO%D`Ha)zdx@|~fVy!*0lao*hGY7QQTyt7%0}}MqUa=67}~-%}3rI-e9{!WV@7? zwT#jWmi6EOLA`H_XxWfNG!F}+mlcL8Cv9ezbS#)t0WCIj?bxI)FX4Z|2k6$8vDRxq0t&lGh{i^h+cAxCw~tX^P_L0B!(U}W~%>I0+5`ec$}VQ z*N7cC_!6Wlgqro3>wPY{4myVzxr_1>!VXPHAc`Pc!qI#_oG;OCOWkYq2Dzsc6}2Hy;b# zDl*q{+B~-C6osY;6G^r5L=r@|8Y(_-s-jCoNB`;%1dL)OeKJ6!5z^8}y|`mrfNMn{ zgM)Gh(GfI!tWTbBte+-5Ld*UK&-K5o*K7Ioo(QE-;G^`YWxQPD^G)t``^`a@!EMT5 zKO*mBWwh=x;@|la+)YmC{Pp2v%yWAhXeU*k?H;CYsi(#6u+e5#Gg>-@NfX0)KG!8d z57oAG*)jrE*6?dZS(SBo2KVHhLV7o#26_U{xIVzHM%8aG?@~1}z6l!9J?L;`L0)dw z>A%Z^<-#61fA#cXxe+)$Tps>^qlybLsz;T50Xp z&V1WA>a`aWv&nKb$9p$+Q=|TZvus5l+e!$3*~|~iEai}A=>n(g+mv*>od4iq@dJzl zIWVd$&eCk5jcUEZ89MZUm+N?*5`HypRpUQ+Sn1~VHD0-~L*vS_J>F~M$`0v#(a+X? zv7E=7TW4QAvKG7O(>q4DiqSGdJ~WtPq|fS?n{YOd!(_1vr?W((fwtJJ!r5vWCd)V^ zib`3y9PtAS_WrRiP>R>F2MLy;&lllr^BQgzwvoRs!X!z;S+bT#&K9>|`TdLf{-J04 zeU>bIXt0buS%x~;0B&Chm=uWvj= zOgK!gqPvEbKIm}m)jly;i18u)2482~rdeKKnt=2fSKoRN%RB~xSY%VDX=~gb-efXh zGuCw8j5GS55v!sXlH!#JxvM$`eCkGk3yo^nA0xUDeH}pk10(psQukhIr}*TDP=y1( z)0-F?w8*buq$>s4*BMn&wf`$Vv}ESD2f~1z{>5zsGM;o9MkgR;s3^!H7|le>IE)3w z&K9f;PmR*3^DiIuOk?BjpKeo5_@F<3?Y=pHbKK0k%|zK`JDUw~h`&nn4N_3!0#}Bi zY&pWQ+%JOddO3~RI@arHEcNmj$s}0n`H7@}V4W2XV_!39^q$kcxXuuSY`MYl{xlVqEIV(ByrfmHrD=E6sEO$C)Yux*QZG# zE-(ntY9t_9zim+2ditzXC_K^lfPNFV7yW~BM_oU!h+Xz1X&^c-91PX9hR-oa{!)rC za)v;G=8ZGJNw)chVwfb|WyD%>WcP%qsPctGq|Bt4DtGvYN&mPIk3Meok@ygaF;Yke zyTuufY6wS!BqZ!^$ir~QNA2Ddl&Rk}z~PJaIv{;6*fbj4#yvTZpHH{6<}pyTz^1GH9AR7UNFOme51)D##38!`enMH2Z3;=1lls!+k6wQ*5v=h z#*myNdYgIgox|B;u~;|=}Ju5)fvT-Q~7k0!V;QjiDIxfmWV zC(v`G!AVFad^j#^g5I{NH*b!l%fMo|^I4R#K6bhhBBlYntc8l?&>lWpb7^-!bkrCR zpE&sDay;V3;;*&ECGyT)n1jbPahF>~?nQNrT3Frh!uJ`{KssQ?v5T}`lzLn|fI3iq ztxUWF_n}et)>x$o&R2fsc-~D6IL!#N?7K z(#Y)2ks*RZual1a62;>%V?Pb92aZQp^VJD*P?*BKl?trha#eXj!QO4KG~Ow04s}ke zmN#7`O6i-ZB{>Wt%N3IKBGrUL^k|>;mBkoFz8AP28JIjv_CeWrWitEXl8)?O9%o(X zaA#n;qx2wLzQ%w|onH1V6-MBP1w;VQOv~npIWN$;!CU@^UL4pTB=G$K)6B)t+-rv` zrKpHj`ia~$JckyNeStu`{xs8u2^O=76xUp(V2pqcM_xeJERdRdHu``~&>o`!79dLg$vuTR5#_i9;#f{dCycJZv5 zN8qV%giYmh4D&E1C|H9J4BN!Vd{OUkR%01sLruQw(?BwYX>$Oh;;)~FXQ6B9F-AL@ zI~XS&k$nZ8dya-DU;y&7CuTire~uYkG9L1?2ghYBi37NHhmQKx?M~kkNwiBB+{s^J zGUGbwjS1SOYZUZf5Seg=atNs9afsIyOrmOl7N6M=+Ug8EKa{RmhWlHn?IQcY-zcUi z(ky>XZLVd`knS2HwRsG*rOCCwe}6|sPC^X+?NF6H34L|&z6-Y&4Z4P=UCO_$S&E51 z1bJ)rU-Bf_QmG;36tsvv!Eh0GS7+*cxXM-I7iQ1SnfF8+CDlK{QYie^qnd zK%~l^Gid_GdhvP-)s}Rh)<~c%0F|n_U({-G`c9Sus}h!?`DR(*L%u=&QrcD-z}UA2 zE%M7gI3>PGme5~a0Rv6Fx7GOuZaOfJRZ5CQ)<#+2E^rsjGQ@YSrF2Q}71Rmfh64Dg zg<)jR9i>;E>|W4JJ71mI6G#OQ^?c#KUGf^IybG6|C4p~gTHL| zIIC(LJ{@HT*gZde6`6ndi)!H+f_DT-6v9|G&^kEb^HFvMcE)mnE)$RmbkPNao2W&{ z{<%i@3?O}Fn5RJ7J`ohX61^AH!%TV}gPz2k#~H&)RXoBO4ZL$pAIsNQ{vcl4xbIEyqxy9hCDzwqmg2F z!WNaK(2mG-VL*kJh*D&1kr-!^MKS=$UGphARlmz$lFgXqxJWfa6~0+@;@oaIQu;A! z&N+Wi5RT|fBemtu*0J=#89H=+|7@}aI@{_!#nIN*Rh(Y+zKmDS&K7ol|DNJQO>?K1 zKjkI+2|7>tMusp)$Jy&3X(_s;l_aMDkMaTAmOlqR2FP2%k|&o2W8Z02>bjw^(>y?pQ8L<7t_<|k8SYi;dFNjc`i>!3wzcO#;5}~} z$MBlucN&Uquol^^){xGZF92(U8-w51D|P~bhgN=*8qpX zF=OY|G8e;bNg4-_DwyBz%X8lPdBjm_{iJ0>eBY?9UM5T$Eggw51umYI?J5-g9hz(=W_6p--EsT zwJO;J-DLEAxz)cE_MB!#z&%uVykD2ccrd)gMlr=>wXN@@Sl6DN0sff55(hE2IHylxVB`=7pd6YMCWopx!RWV_qIJbij79vP~NMQTBoNDSEd;nl1Kgw7N|X zm!_>w-C3WvULV%4IG$r5-<#GWYU})X6iZC>9Q#03eU@Us?%w$&CpTV>1h0vfX6e54 z@49p5{v^GYT!7LOHBVOiaimX}7Q7l++WioX$_{T%z-61*URvdKx`5d_m>vRf(QHD|+v64vSmHImdw3*ttz~~*@8egTY)+L1%_MoYH zU_!FGI(d@ORwfBN8Ep(ztNPEEh-5IhO)ux7B58GT+vep_JnoOz30lrJT1|E-fzmPt z<@IfPMn|mYF6f~>GZ7n9noOi}$@03arC$}A$(U6 z!p=L;Wxur{@`0>Tqg^P=Mvs;gtv|l_QR8>V+d*=1?++f7ofN+jp;Rrr&=174jP5@? zlJ!RRmywbKUf^O=40Mw+b6kPaXWYj?gON;}S`8uXxbBr7-owJw4=qC(a#<$RpCgad z62h^4z#ZSEaf_G`V6413FMY+v@PI6vjVxJiGlLi*@J`i4rI#})-+jJ5X)A0@EU*9rf14M{DF%(p2*jW zaJJfn$$UvG3k>2WHv-SVOLEYXDoFF0AKqsEl+muj*>VvsHhxIEJBO!WUWc=I7AA|t z54Chh@f3D1mtiuC!+Gq7p519Y1#=wE=ptKrVYXR<10LeZC;>O+p-|?i`l=!;uXt1D z9R&)HJlp75097!aX!Ot_Ja&E)ELJLHsG43ffxJCzk{v@!EmY~3{p2hdB^{qvF_Zv| zC8960YGBCj6o8het&&sNsHskK=qpu$N1v7NFq@PIq)O($&q&VEMyXSZb&Jh$?;VC& zZ#p*TgRuoPcRTtPMx}D!3yi;Asuo43yv(gfsXq6#{B%`LM%~472c$j{9?Ev;M5!cF zzZwN%cwcxDz;fY(7BgAveg|0Vt9G*X7JBMk=`7hZXh__6$S`S6y3iR~r$R1HH)gZ? z2YK`MV}Uiqxi?&;=}Myt7mlJ=?Z;rWu2S9 zn~9LO(^|+ER&B`2E~*WjEnRXIOjorzt8w!NJ4^eUPpNn&7dz5d()%a5p|G;FUo4rVBvNQXZSwxj zq)DoW!56K& zE@+08m9QuWyK=d@*V8 zXgurT4Ih4xgCa|YA|#NSy(GR(v!X&|exrum_(|JlbHLeVnI@9=Da$``x|82B^}Y9P zmwF>iXvByT8?CfrzjV!f3(BYpXbs6jtqOrGtrYxVr5@@!)9!nWbG8D8mzNz;e4&5k z$j^jA3hMgQ`ihc1_8oj%=`*diQh>lH`=~SzsO;+c3SSP-*wXOeD}akW0j^LgDJQW; z&9_~mZ0dR>u#Pig2o{!-kY|$;{gRd5r(e!s7=Y+yDL_oCp!Fc2-~c;_?p80#OPvTg z1VHp3xY?&ZYn>JmA>a*XM&a1ij)y=Jxjc7r9VYX*rr-CBpTa~b&)E~ZSjQuYO(bIF z2xOoL)RLH^6rg-A77*2R4CBYNqLo4$e7Mv(DT$~n_*I6|7!Iir!3|vlOqOVsF0YMD0aZbY4^zt z%uS!JLz!b%UdU29p}*dfE6@L|+pxRu@qwi=Tehhq0ddYrdhigYl9l#)$Q3qHRi^w-GMXgT}-?SkvC=!|M~ zii*5x2c)RuEEbDb;GLUBK$e2yO~8(rh%N+zJ}ajo5CQ*YMZcLY$agd@9J>7IR;)}_ zjhk~-HaMb*cOE8e-4jNL5dZX^>Bq^Dg0g;<;!a+|i*4_w}>2%UF;9JcPN*R2Oi z39Hb}Xrbj(%(7Q7RTkg3J3I zc$tn!{otzyPy9jq_H5Mh zlJvNi=k^+K72!LC)Et6D(0%mC&l3JPRxWL2 z#3&8jx;(y3&$vG2O+$LL=xA%cRa7YFf5#KE6E$Wtbjpjb?Y~x+I>&YJ@AxA;Rb@pj z51Uq{}1}DM)a$DZ@v=7t$T5cP#6x5 z+=s8+9?H>!T8E+#LvHL$3>G(j|n96MzL^1S#ur&S0GJcepV^T=p2|O=BflTS|Fe$#`@HrhU;a3+ zy#@CjUV96qzdx_Nbs*38+S|DQhME_-M8Ra(E?s#^#o^llwW;^*fY$Av+W}OT)ulY( z6RDiYKj#vZZP7rSdt95hF>`Duny$;c7TeC>Sqs~tMr}gQucnaZ^=v> zsVBRL>0Q%?=Fr>I?H>)VV_)jX%a0O&w&9o#=Ni9<xLfoAMF?yD zs*!s5{(3o`0cAvgYpWI&V~hYejV5`k2PHDM~K=W2>Mo9zgHc^{JlooIe&7 z2EB6sZ`EX=gmlcm_AKG&xha3XVsuaFpF&mHC&Jt=&>%v~z-jV;Q&nSg9sh|`lVLsm z5o^N18gL_1Czj{-^qVw`yw_eW7*bvOO$&lFQdj#>;WF}ET(a*Q<64M>5=V)1LHYEt z+B42eMvoJyJLQ^uu3Z54WX1u|a+=g4f-NUqo@{~Xium^6(Mn29I*;X}mHFb?xwP~; z?LYresl2e320P*~OC# zSyh0pj3xJa9~#vh1fsze({E*4t$v1{mO;k0#vWZxmgCttg=NwT|Dr}uKZ9O>Wv3}s z7yefp{uy;IIwZQGUvwX}i2szhG>hZ+x1Ick;a}<;6=8!)a&=hena{OBUs$3aB~(h| zgmR}&lC%!XCn`)L=`vPaanMC6t~X5YGA+V1QEqZ)uXLZQq)ZQ0QJ`}J`OHnIG~cxf zmEM-xRkAm>aF9phmRv0au@qWc)E}0nLz;3vmiMSanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/frontend-dist/index.html.gz b/frontend-dist/index.html.gz index 81bb4d91f4c1d66791a752a31f1d9a3655762640..5b7037384ab5d064747eb7e968dd21337010d640 100644 GIT binary patch delta 510 zcmV10_zGYu-vUlW0$)>d^K#^zkT#MWHHR>K8 zNM1Uu#bj_lQs5_Xd!u=%HBLrhwt$WChK;mYRMKL7zH#!WamhX66frD7wtp6DPn!qX ztTS9InlOl_vc~Tqpsj^b3SqN&)h#pa~&s#q_p zwMEd_VK}thVGt05szq@h3pFIa%O>=iLd-AUlouD}w$1OOXsTkR{!K!TV_vFGU+By0 zXT-&?qdzJ>&(>WlU0!X^a}}dlZH+uzi~}Nzm+V8LtMjeWcvb$1Q*W$G)smi@%F|;9 z9LV?0S3C;{kwTcEO$>3F*mvXlA+?|hqd#NVQ`o^6XvAP=*c%=wF?^Jhyjur>{;&@^ zhffw|#3Kg7z_j>de8Rjcj#;bXcOlwLVD$3z57lZjHC3@zTP%OXFMT$NY%>G^0LlIB A{r~^~ delta 510 zcmVAOmZ zy6jQvx^&1AR4+qBu0-NCyB5dWo_WadM>1n2zGYu-vUlVL$)>R=K#^zkT#4KF73vNj zNM1Uu#At9oP~b;#d!xCpG>%4LHiMP%hK;mYRMKL#SvmRBxa3YaMGP~Ljeo_;)9OJs zYYkV5Mhv1Zt?@euXe(h9c>#UEwh~2T$wn0pwULFTj`G2GXW?=fEM`ne_1S+?os7GG z;eaAbp%O3KZL?jk&xfQjs$d2-2bt5H?xdd*!maB*qy{p$0Y@5xht^nxo+2CH!C)n~ z6x_Mu4yQc@9iPdqj(V#zm46i&C%Z>bSxOorQ;<&`m5F-_&xAi4QI~AkVtrP4SuB_3 z(jsVVF&tWMF$jo3Rie0$h3b>vWg~h`A?9yhZ7(mk>n6XCqArVt`ZozV47tQ>{d%L- z6XNXG(H|9`W^3Ony}ep*auuUkY>hlwj6EWY=j=nGtIb+zyxRVWQ*SIw)sUX*($lE} z4&=M~D_#VINFhwnB!)Oo?7MMYpBm7F(O)p^DePbfG+?k3><#yn7(U8T-YtVbf7l0| z!zYU};t_*kV4D3gK4D%K$E;=XyAW+gFnWIahibJM>#|s?E#^Ps7f+?y^)mzj0H74` AF8}}l diff --git a/frontend-dist/js/183.37299d64.js b/frontend-dist/js/183.37299d64.js deleted file mode 100644 index 5977f4e8..00000000 --- a/frontend-dist/js/183.37299d64.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[183],{2893:function(t,e,s){s(85331)},4885:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},34396:function(t,e,s){s(85331),s(4885)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},63003:function(t,e,s){s(85331)},64183:function(t,e,s){s.r(e),s.d(e,{default:function(){return Yg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>c.handleSelect(e.index)},[(0,i.bF)(h,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-5cddfe48"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(91570));const m={class:"container"},b={class:"header-content admin-header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],M={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},U={class:"calendar-grid"},I=["onClick"];function O(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:e[1]||(e[1]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",M,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:e[3]||(e[3]=(...t)=>l.handleManualInput&&l.handleManualInput(...t))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>l.goToPreviousMonth&&l.goToPreviousMonth(...t))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>l.goToNextMonth&&l.goToNextMonth(...t))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",U,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":l.isInRange(t.key)}]),onClick:e=>l.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,I))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tl.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",lt,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",rt,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ct,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ht,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xt,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Mt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Dt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Vt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Lt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",Ut,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",It,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",qt,(0,n.v_)(e),1),(0,i.Lk)("span",Ht,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Qt,[(0,i.Lk)("div",Yt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",le,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",re,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ce,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",he,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>l.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698);var Pe=s(70797),Me={rE:"2.7.5"},De=(s(20116),s(91114));s(22489),s(13579); -/*! - * @kurkle/color v0.3.4 - * https://github.com/kurkle/color#readme - * (c) 2024 Jukka Kurkela - * Released under the MIT License - */ -function Ae(t){return t+.5|0}const $e=(t,e,s)=>Math.max(Math.min(t,s),e);function Ve(t){return $e(Ae(2.55*t),0,255)}function Le(t){return $e(Ae(255*t),0,255)}function Ee(t){return $e(Ae(t/2.55)/100,0,1)}function Ue(t){return $e(Ae(100*t),0,100)}const Ie={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Oe=[..."0123456789ABCDEF"],Re=t=>Oe[15&t],We=t=>Oe[(240&t)>>4]+Oe[15&t],Be=t=>(240&t)>>4===(15&t),Ne=t=>Be(t.r)&&Be(t.g)&&Be(t.b)&&Be(t.a);function ze(t){var e,s=t.length;return"#"===t[0]&&(4===s||5===s?e={r:255&17*Ie[t[1]],g:255&17*Ie[t[2]],b:255&17*Ie[t[3]],a:5===s?17*Ie[t[4]]:255}:7!==s&&9!==s||(e={r:Ie[t[1]]<<4|Ie[t[2]],g:Ie[t[3]]<<4|Ie[t[4]],b:Ie[t[5]]<<4|Ie[t[6]],a:9===s?Ie[t[7]]<<4|Ie[t[8]]:255})),e}const je=(t,e)=>t<255?e(t):"";function qe(t){var e=Ne(t)?Re:We;return t?"#"+e(t.r)+e(t.g)+e(t.b)+je(t.a,e):void 0}const He=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Xe(t,e,s){const i=e*Math.min(s,1-s),n=(e,n=(e+t/30)%12)=>s-i*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Ke(t,e,s){const i=(i,n=(i+t/60)%6)=>s-s*e*Math.max(Math.min(n,4-n,1),0);return[i(5),i(3),i(1)]}function Qe(t,e,s){const i=Xe(t,1,.5);let n;for(e+s>1&&(n=1/(e+s),e*=n,s*=n),n=0;n<3;n++)i[n]*=1-e-s,i[n]+=e;return i}function Ye(t,e,s,i,n){return t===n?(e-s)/i+(e.5?c/(2-a-o):c/(a+o),r=Ye(s,i,n,c,a),r=60*r+.5),[0|r,d||0,l]}function Je(t,e,s,i){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,s,i)).map(Le)}function Ze(t,e,s){return Je(Xe,t,e,s)}function ts(t,e,s){return Je(Qe,t,e,s)}function es(t,e,s){return Je(Ke,t,e,s)}function ss(t){return(t%360+360)%360}function is(t){const e=He.exec(t);let s,i=255;if(!e)return;e[5]!==s&&(i=e[6]?Ve(+e[5]):Le(+e[5]));const n=ss(+e[2]),a=+e[3]/100,o=+e[4]/100;return s="hwb"===e[1]?ts(n,a,o):"hsv"===e[1]?es(n,a,o):Ze(n,a,o),{r:s[0],g:s[1],b:s[2],a:i}}function ns(t,e){var s=Ge(t);s[0]=ss(s[0]+e),s=Ze(s),t.r=s[0],t.g=s[1],t.b=s[2]}function as(t){if(!t)return;const e=Ge(t),s=e[0],i=Ue(e[1]),n=Ue(e[2]);return t.a<255?`hsla(${s}, ${i}%, ${n}%, ${Ee(t.a)})`:`hsl(${s}, ${i}%, ${n}%)`}const os={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},ls={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function rs(){const t={},e=Object.keys(ls),s=Object.keys(os);let i,n,a,o,l;for(i=0;i>16&255,a>>8&255,255&a]}return t}let ds;function cs(t){ds||(ds=rs(),ds.transparent=[0,0,0,0]);const e=ds[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const hs=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function us(t){const e=hs.exec(t);let s,i,n,a=255;if(e){if(e[7]!==s){const t=+e[7];a=e[8]?Ve(t):$e(255*t,0,255)}return s=+e[1],i=+e[3],n=+e[5],s=255&(e[2]?Ve(s):$e(s,0,255)),i=255&(e[4]?Ve(i):$e(i,0,255)),n=255&(e[6]?Ve(n):$e(n,0,255)),{r:s,g:i,b:n,a:a}}}function ps(t){return t&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${Ee(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`)}const gs=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,fs=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function ms(t,e,s){const i=fs(Ee(t.r)),n=fs(Ee(t.g)),a=fs(Ee(t.b));return{r:Le(gs(i+s*(fs(Ee(e.r))-i))),g:Le(gs(n+s*(fs(Ee(e.g))-n))),b:Le(gs(a+s*(fs(Ee(e.b))-a))),a:t.a+s*(e.a-t.a)}}function bs(t,e,s){if(t){let i=Ge(t);i[e]=Math.max(0,Math.min(i[e]+i[e]*s,0===e?360:1)),i=Ze(i),t.r=i[0],t.g=i[1],t.b=i[2]}}function ys(t,e){return t?Object.assign(e||{},t):t}function xs(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Le(t[3]))):(e=ys(t,{r:0,g:0,b:0,a:1}),e.a=Le(e.a)),e}function vs(t){return"r"===t.charAt(0)?us(t):is(t)}class _s{constructor(t){if(t instanceof _s)return t;const e=typeof t;let s;"object"===e?s=xs(t):"string"===e&&(s=ze(t)||cs(t)||vs(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=ys(this._rgb);return t&&(t.a=Ee(t.a)),t}set rgb(t){this._rgb=xs(t)}rgbString(){return this._valid?ps(this._rgb):void 0}hexString(){return this._valid?qe(this._rgb):void 0}hslString(){return this._valid?as(this._rgb):void 0}mix(t,e){if(t){const s=this.rgb,i=t.rgb;let n;const a=e===n?.5:e,o=2*a-1,l=s.a-i.a,r=((o*l===-1?o:(o+l)/(1+o*l))+1)/2;n=1-r,s.r=255&r*s.r+n*i.r+.5,s.g=255&r*s.g+n*i.g+.5,s.b=255&r*s.b+n*i.b+.5,s.a=a*s.a+(1-a)*i.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=ms(this._rgb,t._rgb,e)),this}clone(){return new _s(this.rgb)}alpha(t){return this._rgb.a=Le(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=Ae(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return bs(this._rgb,2,t),this}darken(t){return bs(this._rgb,2,-t),this}saturate(t){return bs(this._rgb,1,t),this}desaturate(t){return bs(this._rgb,1,-t),this}rotate(t){return ns(this._rgb,t),this}} -/*! - * Chart.js v4.5.1 - * https://www.chartjs.org - * (c) 2025 Chart.js Contributors - * Released under the MIT License - */ -function ks(){}const ws=(()=>{let t=0;return()=>t++})();function Cs(t){return null===t||void 0===t}function Ss(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Fs(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function Ts(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function Ps(t,e){return Ts(t)?t:e}function Ms(t,e){return"undefined"===typeof t?e:t}const Ds=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,As=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function $s(t,e,s){if(t&&"function"===typeof t.call)return t.apply(s,e)}function Vs(t,e,s,i){let n,a,o;if(Ss(t))if(a=t.length,i)for(n=a-1;n>=0;n--)e.call(s,t[n],n);else for(n=0;nt,x:t=>t.x,y:t=>t.y};function Ns(t){const e=t.split("."),s=[];let i="";for(const n of e)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(s.push(i),i="");return s}function zs(t){const e=Ns(t);return t=>{for(const s of e){if(""===s)break;t=t&&t[s]}return t}}function js(t,e){const s=Bs[e]||(Bs[e]=zs(e));return s(t)}function qs(t){return t.charAt(0).toUpperCase()+t.slice(1)}const Hs=t=>"undefined"!==typeof t,Xs=t=>"function"===typeof t,Ks=(t,e)=>{if(t.size!==e.size)return!1;for(const s of t)if(!e.has(s))return!1;return!0};function Qs(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const Ys=Math.PI,Gs=2*Ys,Js=Gs+Ys,Zs=Number.POSITIVE_INFINITY,ti=Ys/180,ei=Ys/2,si=Ys/4,ii=2*Ys/3,ni=Math.log10,ai=Math.sign;function oi(t,e,s){return Math.abs(t-e)t-e).pop(),e}function di(t){return"symbol"===typeof t||"object"===typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}function ci(t){return!di(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function hi(t,e){const s=Math.round(t);return s-e<=t&&s+e>=t}function ui(t,e,s){let i,n,a;for(i=0,n=t.length;ir&&d=Math.min(e,s)-i&&t<=Math.max(e,s)+i}function Ci(t,e,s){s=s||(s=>t[s]1)i=a+n>>1,s(i)?a=i:n=i;return{lo:a,hi:n}}const Si=(t,e,s,i)=>Ci(t,s,i?i=>{const n=t[i][e];return nt[i][e]Ci(t,s,i=>t[i][e]>=s);function Ti(t,e,s){let i=0,n=t.length;while(ii&&t[n-1]>s)n--;return i>0||n{const s="_onData"+qs(e),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=i.apply(this,e);return t._chartjs.listeners.forEach(t=>{"function"===typeof t[s]&&t[s](...e)}),n}})}))}function Di(t,e){const s=t._chartjs;if(!s)return;const i=s.listeners,n=i.indexOf(e);-1!==n&&i.splice(n,1),i.length>0||(Pi.forEach(e=>{delete t[e]}),delete t._chartjs)}function Ai(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const $i=function(){return"undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame}();function Vi(t,e){let s=[],i=!1;return function(...n){s=n,i||(i=!0,$i.call(window,()=>{i=!1,t.apply(e,s)}))}}function Li(t,e){let s;return function(...i){return e?(clearTimeout(s),s=setTimeout(t,e,i)):t.apply(this,i),e}}const Ei=t=>"start"===t?"left":"end"===t?"right":"center",Ui=(t,e,s)=>"start"===t?e:"end"===t?s:(e+s)/2,Ii=(t,e,s,i)=>{const n=i?"left":"right";return t===n?s:"center"===t?(e+s)/2:e};function Oi(t,e,s){const i=e.length;let n=0,a=i;if(t._sorted){const{iScale:o,vScale:l,_parsed:r}=t,d=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,c=o.axis,{min:h,max:u,minDefined:p,maxDefined:g}=o.getUserBounds();if(p){if(n=Math.min(Si(r,c,h).lo,s?i:Si(e,c,o.getPixelForValue(h)).lo),d){const t=r.slice(0,n+1).reverse().findIndex(t=>!Cs(t[l.axis]));n-=Math.max(0,t)}n=_i(n,0,i-1)}if(g){let t=Math.max(Si(r,o.axis,u,!0).hi+1,s?0:Si(e,c,o.getPixelForValue(u),!0).hi+1);if(d){const e=r.slice(t-1).findIndex(t=>!Cs(t[l.axis]));t+=Math.max(0,e)}a=_i(t,n,i)-n}else a=i-n}return{start:n,count:a}}function Ri(t){const{xScale:e,yScale:s,_scaleRanges:i}=t,n={xmin:e.min,xmax:e.max,ymin:s.min,ymax:s.max};if(!i)return t._scaleRanges=n,!0;const a=i.xmin!==e.min||i.xmax!==e.max||i.ymin!==s.min||i.ymax!==s.max;return Object.assign(i,n),a}const Wi=t=>0===t||1===t,Bi=(t,e,s)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*Gs/s),Ni=(t,e,s)=>Math.pow(2,-10*t)*Math.sin((t-e)*Gs/s)+1,zi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*ei),easeOutSine:t=>Math.sin(t*ei),easeInOutSine:t=>-.5*(Math.cos(Ys*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Wi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Wi(t)?t:Bi(t,.075,.3),easeOutElastic:t=>Wi(t)?t:Ni(t,.075,.3),easeInOutElastic(t){const e=.1125,s=.45;return Wi(t)?t:t<.5?.5*Bi(2*t,e,s):.5+.5*Ni(2*t-1,e,s)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-zi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,s=2.75;return t<1/s?e*t*t:t<2/s?e*(t-=1.5/s)*t+.75:t<2.5/s?e*(t-=2.25/s)*t+.9375:e*(t-=2.625/s)*t+.984375},easeInOutBounce:t=>t<.5?.5*zi.easeInBounce(2*t):.5*zi.easeOutBounce(2*t-1)+.5};function ji(t){if(t&&"object"===typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function qi(t){return ji(t)?t:new _s(t)}function Hi(t){return ji(t)?t:new _s(t).saturate(.5).darken(.1).hexString()}const Xi=["x","y","borderWidth","radius","tension"],Ki=["color","borderColor","backgroundColor"];function Qi(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:Ki},numbers:{type:"number",properties:Xi}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})}function Yi(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const Gi=new Map;function Ji(t,e){e=e||{};const s=t+JSON.stringify(e);let i=Gi.get(s);return i||(i=new Intl.NumberFormat(t,e),Gi.set(s,i)),i}function Zi(t,e,s){return Ji(e,s).format(t)}const tn={values(t){return Ss(t)?t:""+t},numeric(t,e,s){if(0===t)return"0";const i=this.chart.options.locale;let n,a=t;if(s.length>1){const e=Math.max(Math.abs(s[0].value),Math.abs(s[s.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),a=en(t,s)}const o=ni(Math.abs(a)),l=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),r={notation:n,minimumFractionDigits:l,maximumFractionDigits:l};return Object.assign(r,this.options.ticks.format),Zi(t,i,r)},logarithmic(t,e,s){if(0===t)return"0";const i=s[e].significand||t/Math.pow(10,Math.floor(ni(t)));return[1,2,3,5,10,15].includes(i)||e>.8*s.length?tn.numeric.call(this,t,e,s):""}};function en(t,e){let s=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(s)>=1&&t!==Math.floor(t)&&(s=t-Math.floor(t)),s}var sn={formatters:tn};function nn(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:sn.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}const an=Object.create(null),on=Object.create(null);function ln(t,e){if(!e)return t;const s=e.split(".");for(let i=0,n=s.length;it.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>Hi(e.backgroundColor),this.hoverBorderColor=(t,e)=>Hi(e.borderColor),this.hoverColor=(t,e)=>Hi(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return rn(this,t,e)}get(t){return ln(this,t)}describe(t,e){return rn(on,t,e)}override(t,e){return rn(an,t,e)}route(t,e,s,i){const n=ln(this,t),a=ln(this,s),o="_"+e;Object.defineProperties(n,{[o]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[o],e=a[i];return Fs(t)?Object.assign({},e,t):Ms(t,e)},set(t){this[o]=t}}})}apply(t){t.forEach(t=>t(this))}}var cn=new dn({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[Qi,Yi,nn]);function hn(t){return!t||Cs(t.size)||Cs(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function un(t,e,s,i,n){let a=e[n];return a||(a=e[n]=t.measureText(n).width,s.push(n)),a>i&&(i=a),i}function pn(t,e,s,i){i=i||{};let n=i.data=i.data||{},a=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},a=i.garbageCollect=[],i.font=e),t.save(),t.font=e;let o=0;const l=s.length;let r,d,c,h,u;for(r=0;rs.length){for(r=0;r0&&t.stroke()}}function yn(t,e,s){return s=s||.5,!e||t&&t.x>e.left-s&&t.xe.top-s&&t.y0&&""!==a.strokeColor;let r,d;for(t.save(),t.font=n.string,wn(t,a),r=0;r+t||0;function $n(t,e){const s={},i=Fs(e),n=i?Object.keys(e):e,a=Fs(t)?i?s=>Ms(t[s],t[e[s]]):e=>t[e]:()=>t;for(const o of n)s[o]=An(a(o));return s}function Vn(t){return $n(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Ln(t){return $n(t,["topLeft","topRight","bottomLeft","bottomRight"])}function En(t){const e=Vn(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Un(t,e){t=t||{},e=e||cn.font;let s=Ms(t.size,e.size);"string"===typeof s&&(s=parseInt(s,10));let i=Ms(t.style,e.style);i&&!(""+i).match(Mn)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);const n={family:Ms(t.family,e.family),lineHeight:Dn(Ms(t.lineHeight,e.lineHeight),s),size:s,style:i,weight:Ms(t.weight,e.weight),string:""};return n.string=hn(n),n}function In(t,e,s,i){let n,a,o,l=!0;for(n=0,a=t.length;ns&&0===t?0:t+e;return{min:o(i,-Math.abs(a)),max:o(n,a)}}function Rn(t,e){return Object.assign(Object.create(t),e)}function Wn(t,e=[""],s,i,n=()=>t[0]){const a=s||t;"undefined"===typeof i&&(i=sa("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:a,_fallback:i,_getTarget:n,override:s=>Wn([s,...t],e,a,i)};return new Proxy(o,{deleteProperty(e,s){return delete e[s],delete e._keys,delete t[0][s],!0},get(s,i){return qn(s,i,()=>ea(i,e,t,s))},getOwnPropertyDescriptor(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf(){return Reflect.getPrototypeOf(t[0])},has(t,e){return ia(t).includes(e)},ownKeys(t){return ia(t)},set(t,e,s){const i=t._storage||(t._storage=n());return t[e]=i[e]=s,delete t._keys,!0}})}function Bn(t,e,s,i){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:s,_stack:new Set,_descriptors:Nn(t,i),setContext:e=>Bn(t,e,s,i),override:n=>Bn(t.override(n),e,s,i)};return new Proxy(n,{deleteProperty(e,s){return delete e[s],delete t[s],!0},get(t,e,s){return qn(t,e,()=>Hn(t,e,s))},getOwnPropertyDescriptor(e,s){return e._descriptors.allKeys?Reflect.has(t,s)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,s)},getPrototypeOf(){return Reflect.getPrototypeOf(t)},has(e,s){return Reflect.has(t,s)},ownKeys(){return Reflect.ownKeys(t)},set(e,s,i){return t[s]=i,delete e[s],!0}})}function Nn(t,e={scriptable:!0,indexable:!0}){const{_scriptable:s=e.scriptable,_indexable:i=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:s,indexable:i,isScriptable:Xs(s)?s:()=>s,isIndexable:Xs(i)?i:()=>i}}const zn=(t,e)=>t?t+qs(e):e,jn=(t,e)=>Fs(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qn(t,e,s){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const i=s();return t[e]=i,i}function Hn(t,e,s){const{_proxy:i,_context:n,_subProxy:a,_descriptors:o}=t;let l=i[e];return Xs(l)&&o.isScriptable(e)&&(l=Xn(e,l,t,s)),Ss(l)&&l.length&&(l=Kn(e,l,t,o.isIndexable)),jn(e,l)&&(l=Bn(l,n,a&&a[e],o)),l}function Xn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_stack:l}=s;if(l.has(t))throw new Error("Recursion detected: "+Array.from(l).join("->")+"->"+t);l.add(t);let r=e(a,o||i);return l.delete(t),jn(t,r)&&(r=Jn(n._scopes,n,t,r)),r}function Kn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_descriptors:l}=s;if("undefined"!==typeof a.index&&i(t))return e[a.index%e.length];if(Fs(e[0])){const s=e,i=n._scopes.filter(t=>t!==s);e=[];for(const r of s){const s=Jn(i,n,t,r);e.push(Bn(s,a,o&&o[t],l))}}return e}function Qn(t,e,s){return Xs(t)?t(e,s):t}const Yn=(t,e)=>!0===t?e:"string"===typeof t?js(e,t):void 0;function Gn(t,e,s,i,n){for(const a of e){const e=Yn(s,a);if(e){t.add(e);const a=Qn(e._fallback,s,n);if("undefined"!==typeof a&&a!==s&&a!==i)return a}else if(!1===e&&"undefined"!==typeof i&&s!==i)return null}return!1}function Jn(t,e,s,i){const n=e._rootScopes,a=Qn(e._fallback,s,i),o=[...t,...n],l=new Set;l.add(i);let r=Zn(l,o,s,a||s,i);return null!==r&&(("undefined"===typeof a||a===s||(r=Zn(l,o,a,r,i),null!==r))&&Wn(Array.from(l),[""],n,a,()=>ta(e,s,i)))}function Zn(t,e,s,i,n){while(s)s=Gn(t,e,s,i,n);return s}function ta(t,e,s){const i=t._getTarget();e in i||(i[e]={});const n=i[e];return Ss(n)&&Fs(s)?s:n||{}}function ea(t,e,s,i){let n;for(const a of e)if(n=sa(zn(a,t),s),"undefined"!==typeof n)return jn(t,n)?Jn(s,i,t,n):n}function sa(t,e){for(const s of e){if(!s)continue;const e=s[t];if("undefined"!==typeof e)return e}}function ia(t){let e=t._keys;return e||(e=t._keys=na(t._scopes)),e}function na(t){const e=new Set;for(const s of t)for(const t of Object.keys(s).filter(t=>!t.startsWith("_")))e.add(t);return Array.from(e)}function aa(t,e,s,i){const{iScale:n}=t,{key:a="r"}=this._parsing,o=new Array(i);let l,r,d,c;for(l=0,r=i;le"x"===t?"y":"x";function da(t,e,s,i){const n=t.skip?e:t,a=e,o=s.skip?e:s,l=bi(a,n),r=bi(o,a);let d=l/(l+r),c=r/(l+r);d=isNaN(d)?0:d,c=isNaN(c)?0:c;const h=i*d,u=i*c;return{previous:{x:a.x-h*(o.x-n.x),y:a.y-h*(o.y-n.y)},next:{x:a.x+u*(o.x-n.x),y:a.y+u*(o.y-n.y)}}}function ca(t,e,s){const i=t.length;let n,a,o,l,r,d=la(t,0);for(let c=0;c!t.skip)),"monotone"===e.cubicInterpolationMode)ua(t,n);else{let s=i?t[t.length-1]:t[0];for(a=0,o=t.length;at.ownerDocument.defaultView.getComputedStyle(t,null);function va(t,e){return xa(t).getPropertyValue(e)}const _a=["top","right","bottom","left"];function ka(t,e,s){const i={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=_a[n];i[a]=parseFloat(t[e+"-"+a+s])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}const wa=(t,e,s)=>(t>0||e>0)&&(!s||!s.shadowRoot);function Ca(t,e){const s=t.touches,i=s&&s.length?s[0]:t,{offsetX:n,offsetY:a}=i;let o,l,r=!1;if(wa(n,a,t.target))o=n,l=a;else{const t=e.getBoundingClientRect();o=i.clientX-t.left,l=i.clientY-t.top,r=!0}return{x:o,y:l,box:r}}function Sa(t,e){if("native"in t)return t;const{canvas:s,currentDevicePixelRatio:i}=e,n=xa(s),a="border-box"===n.boxSizing,o=ka(n,"padding"),l=ka(n,"border","width"),{x:r,y:d,box:c}=Ca(t,s),h=o.left+(c&&l.left),u=o.top+(c&&l.top);let{width:p,height:g}=e;return a&&(p-=o.width+l.width,g-=o.height+l.height),{x:Math.round((r-h)/p*s.width/i),y:Math.round((d-u)/g*s.height/i)}}function Fa(t,e,s){let i,n;if(void 0===e||void 0===s){const a=t&&ba(t);if(a){const t=a.getBoundingClientRect(),o=xa(a),l=ka(o,"border","width"),r=ka(o,"padding");e=t.width-r.width-l.width,s=t.height-r.height-l.height,i=ya(o.maxWidth,a,"clientWidth"),n=ya(o.maxHeight,a,"clientHeight")}else e=t.clientWidth,s=t.clientHeight}return{width:e,height:s,maxWidth:i||Zs,maxHeight:n||Zs}}const Ta=t=>Math.round(10*t)/10;function Pa(t,e,s,i){const n=xa(t),a=ka(n,"margin"),o=ya(n.maxWidth,t,"clientWidth")||Zs,l=ya(n.maxHeight,t,"clientHeight")||Zs,r=Fa(t,e,s);let{width:d,height:c}=r;if("content-box"===n.boxSizing){const t=ka(n,"border","width"),e=ka(n,"padding");d-=e.width+t.width,c-=e.height+t.height}d=Math.max(0,d-a.width),c=Math.max(0,i?d/i:c-a.height),d=Ta(Math.min(d,o,r.maxWidth)),c=Ta(Math.min(c,l,r.maxHeight)),d&&!c&&(c=Ta(d/2));const h=void 0!==e||void 0!==s;return h&&i&&r.height&&c>r.height&&(c=r.height,d=Ta(Math.floor(c*i))),{width:d,height:c}}function Ma(t,e,s){const i=e||1,n=Ta(t.height*i),a=Ta(t.width*i);t.height=Ta(t.height),t.width=Ta(t.width);const o=t.canvas;return o.style&&(s||!o.style.height&&!o.style.width)&&(o.style.height=`${t.height}px`,o.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==i||o.height!==n||o.width!==a)&&(t.currentDevicePixelRatio=i,o.height=n,o.width=a,t.ctx.setTransform(i,0,0,i,0,0),!0)}const Da=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};ma()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(e){}return t}();function Aa(t,e){const s=va(t,e),i=s&&s.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function $a(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:t.y+s*(e.y-t.y)}}function Va(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:"middle"===i?s<.5?t.y:e.y:"after"===i?s<1?t.y:e.y:s>0?e.y:t.y}}function La(t,e,s,i){const n={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=$a(t,n,s),l=$a(n,a,s),r=$a(a,e,s),d=$a(o,l,s),c=$a(l,r,s);return $a(d,c,s)}const Ea=function(t,e){return{x(s){return t+t+e-s},setWidth(t){e=t},textAlign(t){return"center"===t?t:"right"===t?"left":"right"},xPlus(t,e){return t-e},leftForLtr(t,e){return t-e}}},Ua=function(){return{x(t){return t},setWidth(t){},textAlign(t){return t},xPlus(t,e){return t+e},leftForLtr(t,e){return t}}};function Ia(t,e,s){return t?Ea(e,s):Ua()}function Oa(t,e){let s,i;"ltr"!==e&&"rtl"!==e||(s=t.canvas.style,i=[s.getPropertyValue("direction"),s.getPropertyPriority("direction")],s.setProperty("direction",e,"important"),t.prevTextDirection=i)}function Ra(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Wa(t){return"angle"===t?{between:vi,compare:yi,normalize:xi}:{between:wi,compare:(t,e)=>t-e,normalize:t=>t}}function Ba({start:t,end:e,count:s,loop:i,style:n}){return{start:t%s,end:e%s,loop:i&&(e-t+1)%s===0,style:n}}function Na(t,e,s){const{property:i,start:n,end:a}=s,{between:o,normalize:l}=Wa(i),r=e.length;let d,c,{start:h,end:u,loop:p}=t;if(p){for(h+=r,u+=r,d=0,c=r;dr(n,b,f)&&0!==l(n,b),_=()=>0===l(a,f)||r(a,b,f),k=()=>y||v(),w=()=>!y||_();for(let C=c,S=c;C<=h;++C)m=e[C%o],m.skip||(f=d(m[i]),f!==b&&(y=r(f,n,a),null===x&&k()&&(x=0===l(f,n)?C:S),null!==x&&w()&&(g.push(Ba({start:x,end:C,loop:u,count:o,style:p})),x=null),S=C,b=f));return null!==x&&g.push(Ba({start:x,end:h,loop:u,count:o,style:p})),g}function ja(t,e){const s=[],i=t.segments;for(let n=0;nn&&t[a%e].skip)a--;return a%=e,{start:n,end:a}}function Ha(t,e,s,i){const n=t.length,a=[];let o,l=e,r=t[e];for(o=e+1;o<=s;++o){const s=t[o%n];s.skip||s.stop?r.skip||(i=!1,a.push({start:e%n,end:(o-1)%n,loop:i}),e=l=s.stop?o:null):(l=o,r.skip&&(e=o)),r=s}return null!==l&&a.push({start:e%n,end:l%n,loop:i}),a}function Xa(t,e){const s=t.points,i=t.options.spanGaps,n=s.length;if(!n)return[];const a=!!t._loop,{start:o,end:l}=qa(s,n,a,i);if(!0===i)return Ka(t,[{start:o,end:l,loop:a}],s,e);const r=li({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var so=new eo;const io="transparent",no={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=qi(t||io),n=i.valid&&qi(e||io);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class ao{constructor(t,e,s,i){const n=e[s];i=In([t.to,i,n,t.from]);const a=In([t.from,n,i]);this._active=!0,this._fn=t.fn||no[t.type||typeof a],this._easing=zi[t.easing]||zi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=In([t.to,e,i,t.from]),this._from=In([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Fs(n))return;const a={};for(const t of e)a[t]=n[t];(Ss(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=ro(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&lo(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(t,e));continue}const d=e[r];let c=n[r];const h=s.get(r);if(c){if(h&&c.active()){c.update(h,d,o);continue}c.cancel()}h&&h.duration?(n[r]=c=new ao(h,t,r,d),i.push(c)):t[r]=d}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(so.add(this._chart,s),!0):void 0}}function lo(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function _o(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,d=o.axis,c=bo(a,o,i),h=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function wo(t,e){return Rn(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Co(t,e,s){return Rn(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function So(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Fo=t=>"reset"===t||"none"===t,To=(t,e)=>e?t:Object.assign({},t),Po=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:po(s,!0),values:null};class Mo{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=mo(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&So(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Ms(s.xAxisID,ko(t,"x")),a=e.yAxisID=Ms(s.yAxisID,ko(t,"y")),o=e.rAxisID=Ms(s.rAxisID,ko(t,"r")),l=e.indexAxis,r=e.iAxisID=i(l,n,a,o),d=e.vAxisID=i(l,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(r),e.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&Di(this._data,this),t._stacked&&So(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Fs(e)){const t=this._cachedMeta;this._data=fo(e,t)}else if(s!==e){if(s){Di(s,this);const t=this._cachedMeta;So(t),t._parsed=[]}e&&Object.isExtensible(e)&&Mi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=mo(e.vScale,e),e.stack!==s.stack&&(i=!0,So(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(_o(this,e._parsed),e._stacked=mo(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,d,c=0===t&&e===i.length||s._sorted,h=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[t])?this.parseArrayData(s,i,t,e):Fs(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===r[o]||h&&r[o]e||c=0;--h)if(!p()){this.updateRangeFromParsed(r,t,u,l);break}return r}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=r.resolveNamedOptions(h,u,p,c);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(To(g,l))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(t,s,e))}const r=new oo(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Fo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Fo(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Fo(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(l(n),o=t;ot-e))}return t._cache.$bar}function Ao(t){const e=t.iScale,s=Do(e,t.type);let i,n,a,o,l=e._length;const r=()=>{32767!==a&&-32768!==a&&(Hs(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,l=tMath.abs(l)&&(r=l,d=o),e[s.axis]=d,e._custom={barStart:r,barEnd:d,start:n,end:a,min:o,max:l}}function Eo(t,e,s,i){return Ss(t)?Lo(t,e,s,i):e[s.axis]=s.parse(t,i),e}function Uo(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),l=n===a,r=[];let d,c,h,u;for(d=s,c=s+i;d=s?1:-1)}function Ro(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),l=o&&o[s.axis],r=t=>{const e=t._parsed.find(t=>t[s.axis]===l),i=e&&e[t.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===e||!r(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Ms("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[t]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(e,i),d=a.axis,c=o.axis;for(let h=e;hvi(t,l,r,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>vi(t,l,r,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,d,h),m=p(ei,c,u),b=g(Ys,d,h),y=g(Ys+ei,c,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,De.A)(Ho,"id","bubble"),(0,De.A)(Ho,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,De.A)(Ho,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Mo{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Fs(s[t])){const{key:t="value"}=this._parsing;o=e=>+js(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?Gs*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,l;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,De.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,l)=>{const r=t.getDatasetMeta(0),d=r.controller.getStyle(l);return{text:e,fillStyle:d.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(l),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:l}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Qo extends Mo{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:l}=Oi(e,i,a);this._drawStart=o,this._drawCount=l,Ri(e)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},t),this.updateElements(i,o,l,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:d,includeOptions:c}=this._getSharedOptions(e,i),h=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=ci(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[h]=a.getPixelForValue(y[h],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[h]-x[h])>f,g&&(p.parsed=y,p.raw=r.data[v]),c&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,De.A)(Qo,"id","line"),(0,De.A)(Qo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,De.A)(Qo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Yo extends Mo{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,d=r.xCenter,c=r.yCenter,h=r.getIndexAngle(0)-.5*Ys;let u,p=h;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?pi(this.resolveDataElementOptions(t,e).angle||s):0}}(0,De.A)(Yo,"id","polarArea"),(0,De.A)(Yo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,De.A)(Yo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,De.A)(Go,"id","pie"),(0,De.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Mo{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=r.data[x]),h&&(d.options=c||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,d,i),y=s}this.updateSharedOptions(c,i,d)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,De.A)(Zo,"id","scatter"),(0,De.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,De.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function tl(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class el{static override(t){Object.assign(el.prototype,t)}constructor(t){(0,De.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return tl()}parse(){return tl()}format(){return tl()}add(){return tl()}diff(){return tl()}startOf(){return tl()}endOf(){return tl()}}var sl={_date:el};function il(t,e,s,i){const{controller:n,data:a,_sorted:o}=t,l=n._cachedMeta.iScale,r=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(l&&e===l.axis&&"r"!==e&&o&&a.length){const o=l._reversePixels?Fi:Si;if(!i){const i=o(a,e,s);if(r){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!Cs(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!Cs(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nl(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let l=0,r=a.length;l{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:r}),l=l||t.inRange(e.x,e.y,n))}),i&&!l?[]:a}var hl={evaluateInteractionItems:nl,modes:{index(t,e,s,i){const n=Sa(e,t),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o),r=[];return l.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=l[0].index,s=t.data[e];s&&!s.skip&&r.push({element:s,datasetIndex:t.index,index:e})}),r):[]},dataset(t,e,s,i){const n=Sa(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?ol(t,n,a,i,o):dl(t,n,a,!1,i,o);if(l.length>0){const e=l[0].datasetIndex,s=t.getDatasetMeta(e).data;l=[];for(let t=0;tt.pos===e)}function gl(t,e){return t.filter(t=>-1===ul.indexOf(t.pos)&&t.box.axis===e)}function fl(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function ml(t){const e=[];let s,i,n,a,o,l;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=fl(pl(e,"left"),!0),n=fl(pl(e,"right")),a=fl(pl(e,"top"),!0),o=fl(pl(e,"bottom")),l=gl(e,"x"),r=gl(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:pl(e,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function vl(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function _l(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function kl(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Fs(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&_l(o,a.getPadding());const l=Math.max(0,e.outerWidth-vl(o,t,"left","right")),r=Math.max(0,e.outerHeight-vl(o,t,"top","bottom")),d=l!==t.w,c=r!==t.h;return t.w=l,t.h=r,s.horizontal?{same:d,other:c}:{same:c,other:d}}function wl(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function Cl(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Sl(t,e,s,i){const n=[];let a,o,l,r,d,c;for(a=0,o=t.length,d=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=r.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,h=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);_l(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yl(r.concat(d),h);Sl(l.fullSize,p,h,g),Sl(r,p,h,g),Sl(d,p,h,g)&&Sl(r,p,h,g),wl(p),Tl(l.leftAndTop,p,h,g),p.x+=p.w,p.y+=p.h,Tl(l.rightAndBottom,p,h,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Vs(l.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Ml{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Dl extends Ml{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Al="$chartjs",$l={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vl=t=>null===t||""===t;function Ll(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Al]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Vl(n)){const e=Aa(t,"width");void 0!==e&&(t.width=e)}if(Vl(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Aa(t,"height");void 0!==e&&(t.height=e)}return t}const El=!!Da&&{passive:!0};function Ul(t,e,s){t&&t.addEventListener(e,s,El)}function Il(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,El)}function Ol(t,e){const s=$l[t.type]||t.type,{x:i,y:n}=Sa(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rl(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function Wl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.addedNodes,i),e=e&&!Rl(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Bl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rl(s.removedNodes,i),e=e&&!Rl(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const Nl=new Map;let zl=0;function jl(){const t=window.devicePixelRatio;t!==zl&&(zl=t,Nl.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function ql(t,e){Nl.size||window.addEventListener("resize",jl),Nl.set(t,e)}function Hl(t){Nl.delete(t),Nl.size||window.removeEventListener("resize",jl)}function Xl(t,e,s){const i=t.canvas,n=i&&ba(i);if(!n)return;const a=Vi((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),ql(t,a),o}function Kl(t,e,s){s&&s.disconnect(),"resize"===e&&Hl(t)}function Ql(t,e,s){const i=t.canvas,n=Vi(e=>{null!==t.ctx&&s(Ol(e,t))},t);return Ul(i,e,n),n}class Yl extends Ml{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Ll(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Al])return!1;const s=e[Al].initial;["height","width"].forEach(t=>{const i=s[t];Cs(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Al],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:Wl,detach:Bl,resize:Xl},a=n[e]||Ql;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:Kl,detach:Kl,resize:Kl},a=n[e]||Il;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Pa(t,e,s,i)}isAttached(t){const e=t&&ba(t);return!(!e||!e.isConnected)}}function Gl(t){return!ma()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Dl:Yl}class Jl{constructor(){(0,De.A)(this,"x",void 0),(0,De.A)(this,"y",void 0),(0,De.A)(this,"active",!1),(0,De.A)(this,"options",void 0),(0,De.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return ci(this.x)&&ci(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function Zl(t,e){const s=t.options.ticks,i=tr(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sr(e):[],o=a.length,l=a[0],r=a[o-1],d=[];if(o>n)return ir(e,d,a,o/n),d;const c=er(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(nr(e,d,c,Cs(i)?0:l-i,l),t=0,s=o-1;tn)return t}return Math.max(n,1)}function sr(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,lr=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,rr=(t,e)=>Math.min(e||t,t);function dr(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+l)))return d}function hr(t,e){Vs(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ps(s,Ps(i,s)),max:Ps(i,Ps(s,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$s(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),c=d.widest.width,h=d.highest.height,u=_i(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),c+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-ur(t.grid)-e.padding-pr(t.title,this.chart.options.font),l=Math.sqrt(c*c+h*h),r=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/l,-1,1))-Math.asin(_i(h/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pr(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=ur(n)+a):(t.height=this.maxHeight,t.width=ur(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=pi(this.labelRotation),d=Math.cos(r),c=Math.sin(r);if(o){const e=s.mirror?0:c*n.width+d*a.height;t.height=Math.min(this.maxHeight,t.height+e+l)}else{const e=s.mirror?0:d*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+l)}this._calculatePadding(e,i,c,d)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,h=0;l?r?(c=i*t.width,h=s*e.height):(c=s*t.height,h=i*e.width):"start"===n?h=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,h=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((h-d+a)*this.width/(this.width-d),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){$s(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return ki(this._alignToPixels?gn(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*i?o/s:l/i:l*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),d=this.ticks,c=d.length+(l?1:0),h=ur(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return gn(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-h,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+h;else if("left"===a)b=m(this.right),_=this.right-h,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+h;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+h}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-h,S=t.left,T=t.right}const M=Ms(i.ticks.maxTicksLimit,c),D=Math.max(1,Math.ceil(c/M));for(y=0;y0&&(a-=i/2);break}h={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:d,textAlign:u,textBaseline:P,translation:[v,_],backdrop:h}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-pi(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,l=a.widest.width;let r,d;return"left"===e?i?(d=this.right+n,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d+=l)):(d=this.right-o,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d=this.left)):"right"===e?i?(d=this.left+n,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d-=l)):(d=this.left+o,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d=this.right)):r="right",{textAlign:r,x:d}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),l=o.pop(),r=o.join(".");cn.route(a,n,r,l)})}function kr(t){return"id"in t&&"defaults"in t}class wr{constructor(){this.controllers=new xr(Mo,"datasets",!0),this.elements=new xr(Jl,"elements"),this.plugins=new xr(Object,"plugins"),this.scales=new xr(yr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):Vs(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=qs(t);$s(s["before"+i],[],s),e[t](s),$s(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Fr(t){const e={},s=[],i=Object.keys(Cr.plugins.items);for(let a=0;a1&&Vr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Ur(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function Ir(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return Ur(t,"x",s[0])||Ur(t,"y",s[0])}return{}}function Or(t,e){const s=an[t.type]||{scales:{}},i=e.scales||{},n=Dr(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Fs(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=Er(e,o,Ir(e,t),cn.scales[o.type]),r=$r(l,n),d=s.scales||{};a[e]=Rs(Object.create(null),[{axis:l},o,d[l],d[r]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Dr(n,e),l=an[n]||{},r=l.scales||{};Object.keys(r).forEach(t=>{const e=Ar(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:e},i[n],r[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Rs(e,[cn.scales[e.type],cn.scale])}),a}function Rr(t){const e=t.options||(t.options={});e.plugins=Ms(e.plugins,{}),e.scales=Or(t,e)}function Wr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Br(t){return t=t||{},t.data=Wr(t.data),Rr(t),t}const Nr=new Map,zr=new Set;function jr(t,e){let s=Nr.get(t);return s||(s=e(),Nr.set(t,s),zr.add(s)),s}const qr=(t,e,s)=>{const i=js(e,s);void 0!==i&&t.add(i)};class Hr{constructor(t){this._config=Br(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Wr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Rr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return jr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return jr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return jr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return jr(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const l=new Set;e.forEach(e=>{t&&(l.add(t),e.forEach(e=>qr(l,t,e))),e.forEach(t=>qr(l,i,t)),e.forEach(t=>qr(l,an[n]||{},t)),e.forEach(t=>qr(l,cn,t)),e.forEach(t=>qr(l,on,t))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),zr.has(e)&&a.set(e,r),r}chartOptionScopes(){const{options:t,type:e}=this;return[t,an[e]||{},cn.datasets[e]||{},{type:e},cn,on]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xr(this._resolverCache,t,i);let l=a;if(Qr(a,e)){n.$shared=!1,s=Xs(s)?s():s;const e=this.createResolver(t,s,o);l=Bn(a,s,e)}for(const r of e)n[r]=l[r];return n}createResolver(t,e,s=[""],i){const{resolver:n}=Xr(this._resolverCache,t,s);return Fs(e)?Bn(n,e,void 0,i):n}}function Xr(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=Wn(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kr=t=>Fs(t)&&Object.getOwnPropertyNames(t).some(e=>Xs(t[e]));function Qr(t,e){const{isScriptable:s,isIndexable:i}=Nn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(Xs(o)||Kr(o))||a&&Ss(o))return!0}return!1}var Yr="4.5.1";const Gr=["top","bottom","left","right","chartArea"];function Jr(t,e){return"top"===t||"bottom"===t||-1===Gr.indexOf(t)&&"x"===e}function Zr(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function td(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),$s(s&&s.onComplete,[t],e)}function ed(t){const e=t.chart,s=e.options.animation;$s(s&&s.onProgress,[t],e)}function sd(t){return ma()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const id={},nd=t=>{const e=sd(t);return Object.values(id).filter(t=>t.canvas===e).pop()};function ad(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function od(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class ld{static register(...t){Cr.add(...t),rd()}static unregister(...t){Cr.remove(...t),rd()}constructor(t,e){const s=this.config=new Hr(e),i=sd(t),n=nd(i);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,d=l&&l.width;this.id=ws(),this.ctx=o,this.canvas=l,this.width=d,this.height=r,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Sr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Li(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&l?(so.listen(this,"complete",td),so.listen(this,"progress",ed),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:i,_aspectRatio:n}=this;return Cs(t)?e&&n?n:i?s/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Cr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Ma(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(t,e){so.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Ma(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Vs(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=Er(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Vs(n,e=>{const n=e.options,a=n.id,o=Er(a,n),l=Ms(n.type,e.dtype);void 0!==n.position&&Jr(n.position,o)===Jr(e.dposition)||(n.position=e.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const t=Cr.getScale(l);r=new t({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,t)}),Vs(i,(t,e)=>{t||delete s[e]}),Vs(s,t=>{Pl.configure(this,t,t.options),Pl.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let r=0,d=this.data.datasets.length;r{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Zr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Vs(this.scales,t=>{Pl.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);Ks(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;ad(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Pl.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],Vs(this.boxes,t=>{s&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,s={meta:t,index:t.index,cancelable:!0},i=to(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(e,i),t.controller.draw(),i&&vn(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return yn(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=hl.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);Hs(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),so.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};Vs(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Vs(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Vs(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!Ls(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),l=Qs(t),r=od(t,this._lastEvent,s,l);s&&(this._lastEvent=null,$s(n.onHover,[t,o,this],this),l&&$s(n.onClick,[t,o,this],this));const d=!Ls(o,i);return(d||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=r,d}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function rd(){return Vs(ld.instances,t=>t._plugins.invalidate())}function dd(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=e,{borderWidth:d,borderJoinStyle:c}=r,h=Math.min(d/o,xi(i-s));if(t.beginPath(),t.arc(n,a,o-d/2,i+h/2,s-h/2),l>0){const e=Math.min(d/l,xi(i-s));t.arc(n,a,l+d/2,s-e/2,i+e/2,!0)}else{const e=Math.min(d/2,o*xi(i-s));if("round"===c)t.arc(n,a,e,s-Ys/2,i+Ys/2,!0);else if("bevel"===c){const o=2*e*e,l=-o*Math.cos(s+Ys/2)+n,r=-o*Math.sin(s+Ys/2)+a,d=o*Math.cos(i+Ys/2)+n,c=o*Math.sin(i+Ys/2)+a;t.lineTo(l,r),t.lineTo(d,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function cd(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=e;let d=n/l;t.beginPath(),t.arc(a,o,l,i-d,s+d),r>n?(d=n/r,t.arc(a,o,r,s+d,i-d,!0)):t.arc(a,o,n,s+ei,i-ei),t.closePath(),t.clip()}function hd(t){return $n(t,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(t,e,s,i){const n=hd(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),l=t=>{const e=(s-Math.min(a,t))*i/2;return _i(t,0,Math.min(a,e))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function gd(t,e,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:d,innerRadius:c}=e,h=Math.max(e.outerRadius+i+s-d,0),u=c>0?c+i+s+d:0;let p=0;const g=n-r;if(i){const t=c>0?c-i:0,e=h>0?h-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*h-s/Ys)/h,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(e,u,h,y-b),w=h-x,C=h-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,M=b+_/T,D=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,l,h,S,e),t.arc(o,l,h,e,F),v>0){const e=pd(C,F,o,l);t.arc(e.x,e.y,v,F,y+ei)}const s=pd(P,y,o,l);if(t.lineTo(s.x,s.y),k>0){const e=pd(P,D,o,l);t.arc(e.x,e.y,k,y+ei,D+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,l,u,y-k/u,i,!0),t.arc(o,l,u,i,b+_/u,!0),_>0){const e=pd(T,M,o,l);t.arc(e.x,e.y,_,M+Math.PI,b-ei)}const n=pd(w,b,o,l);if(t.lineTo(n.x,n.y),x>0){const e=pd(w,S,o,l);t.arc(e.x,e.y,x,b-ei,S)}}else{t.moveTo(o,l);const e=Math.cos(S)*h+o,s=Math.sin(S)*h+l;t.lineTo(e,s);const i=Math.cos(F)*h+o,n=Math.sin(F)*h+l;t.lineTo(i,n)}t.closePath()}function fd(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=e;let r=e.endAngle;if(a){gd(t,e,s,i,r,n);for(let e=0;e=Ys&&0===p&&"miter"!==c&&dd(t,e,f),a||(gd(t,e,s,i,f,n),t.stroke())}(0,De.A)(ld,"defaults",cn),(0,De.A)(ld,"instances",id),(0,De.A)(ld,"overrides",an),(0,De.A)(ld,"registry",Cr),(0,De.A)(ld,"version",Yr),(0,De.A)(ld,"getChart",nd);class bd extends Jl{constructor(t){super(),(0,De.A)(this,"circumference",void 0),(0,De.A)(this,"endAngle",void 0),(0,De.A)(this,"fullCircles",void 0),(0,De.A)(this,"innerRadius",void 0),(0,De.A)(this,"outerRadius",void 0),(0,De.A)(this,"pixelMargin",void 0),(0,De.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:t,y:e}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:d,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),h=(this.options.spacing+this.options.borderWidth)/2,u=Ms(c,l-o),p=vi(n,o,l)&&o!==l,g=u>=Gs||p,f=wi(a,r+h,d+h);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:l,spacing:r}=this.options,d=(i+n)/2,c=(a+o+r+l)/2;return{x:e+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(Ys,s||0)),r=i*l;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,fd(t,this,r,n,a),md(t,this,r,n,a),t.restore()}}function yd(t,e,s=e){t.lineCap=Ms(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Ms(s.borderDash,e.borderDash)),t.lineDashOffset=Ms(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Ms(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ms(s.borderWidth,e.borderWidth),t.strokeStyle=Ms(s.borderColor,e.borderColor)}function xd(t,e,s){t.lineTo(s.x,s.y)}function vd(t){return t.stepped?_n:t.tension||"monotone"===t.cubicInterpolationMode?kn:xd}function _d(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=e,r=Math.max(n,o),d=Math.min(a,l),c=nl&&a>l;return{count:i,start:r,loop:e.loop,ilen:d(o+(d?l-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(r&&(h=n[y(0)],t.moveTo(h.x,h.y)),c=0;c<=l;++c){if(h=n[y(c)],h.skip)continue;const e=h.x,s=h.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function Cd(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?wd:kd}function Sd(t){return t.stepped?Va:t.tension||"monotone"===t.cubicInterpolationMode?La:$a}function Fd(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),yd(t,e.options),t.stroke(n)}function Td(t,e,s,i){const{segments:n,options:a}=e,o=Cd(e);for(const l of n)yd(t,a,l.style),t.beginPath(),o(t,e,l,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,De.A)(bd,"id","arc"),(0,De.A)(bd,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,De.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,De.A)(bd,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Pd="function"===typeof Path2D;function Md(t,e,s,i){Pd&&!e.options.segment?Fd(t,e,s,i):Td(t,e,s,i)}class Dd extends Jl{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,t,i,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Xa(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ja(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],l=Sd(s);let r,d;for(r=0,d=a.length;r"borderDash"!==t&&"fill"!==t});class $d extends Jl{constructor(t){super(),(0,De.A)(this,"parsed",void 0),(0,De.A)(this,"skip",void 0),(0,De.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){e=Hd(t,e,n);const o=n[t],l=n[e];null!==i?(a.push({x:o.x,y:i}),a.push({x:l.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:l.y}))}),a}function Hd(t,e,s){for(;e>t;e--){const t=s[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Xd(t,e,s,i){return t&&e?i(t[s],e[s]):t?t[s]:e?e[s]:0}function Kd(t,e){let s=[],i=!1;return Ss(t)?(i=!0,s=t):s=qd(t,e),s.length?new Dd({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Qd(t){return t&&!1!==t.fill}function Yd(t,e,s){const i=t[e];let n=i.fill;const a=[e];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(t,e,s){const i=ec(t);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],e,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(t,e,s,i){return"-"!==t&&"+"!==t||(s=e+s),!(s===e||s<0||s>=i)&&s}function Zd(t,e){let s=null;return"start"===t?s=e.bottom:"end"===t?s=e.top:Fs(t)?s=e.getPixelForValue(t.value):e.getBasePixel&&(s=e.getBasePixel()),s}function tc(t,e,s){let i;return i="start"===t?s:"end"===t?e.options.reverse?e.min:e.max:Fs(t)?t.value:e.getBaseValue(),i}function ec(t){const e=t.options,s=e.fill;let i=Ms(s&&s.target,s);return void 0===i&&(i=!!e.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sc(t){const{scale:e,index:s,line:i}=t,n=[],a=i.segments,o=i.points,l=ic(e,s);l.push(Kd({x:null,y:e.bottom},i));for(let r=0;r=0;--o){const e=n[o].$filler;e&&(e.line.updateControlPoints(a,e.axis),i&&e.fill&&uc(t.ctx,e,a))}},beforeDatasetsDraw(t,e,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=t.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const e=i[n].$filler;Qd(e)&&uc(t.ctx,e,t.chartArea)}},beforeDatasetDraw(t,e,s){const i=e.meta.$filler;Qd(i)&&"beforeDatasetDraw"===s.drawTime&&uc(t.ctx,i,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vc=(t,e)=>{let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},_c=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class kc extends Jl{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=$s(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const s=t.labels,i=Un(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=vc(s,n);let r,d;e.font=i.string,this.isHorizontal()?(r=this.maxWidth,d=this._fitRows(a,n,o,l)+10):(d=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],d=i+o;let c=t;n.textAlign="left",n.textBaseline="middle";let h=-1,u=-d;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(c+=d,r[r.length-(p>0?0:1)]=0,u+=d,h++),l[p]={left:0,top:u,row:h,width:g,height:i},r[r.length-1]+=g+o}),c}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],d=a-t;let c=o,h=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=wc(s,e,n,t,i);a>0&&u+m+2*o>d&&(c+=h+o,r.push({width:h,height:u}),p+=h+o,g++,h=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},h=Math.max(h,f),u+=m+o}),c+=h,r.push({width:h,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ia(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ui(s,this.left+i,this.right-this.lineWidths[n]);for(const l of e)n!==l.row&&(n=l.row,o=Ui(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+t+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=Ui(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const l of e)l.col!==n&&(n=l.col,o=Ui(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;xn(t,this),this._draw(),vn(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=cn.color,l=Ia(t.rtl,this.left,this.width),r=Un(a.font),{padding:d}=a,c=r.size,h=c/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vc(a,c),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ms(s.lineWidth,1);if(i.fillStyle=Ms(s.fillStyle,o),i.lineCap=Ms(s.lineCap,"butt"),i.lineDashOffset=Ms(s.lineDashOffset,0),i.lineJoin=Ms(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ms(s.strokeStyle,o),i.setLineDash(Ms(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(t,p/2),d=e+h;bn(i,o,r,d,a.pointStyleWidth&&p)}else{const a=e+Math.max((c-g)/2,0),o=l.leftForLtr(t,p),r=Ln(s.borderRadius);i.beginPath(),Object.values(r).some(t=>0!==t)?Tn(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Fn(i,s.text,t,e+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ui(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ui(n,this.top+x+d,this.bottom-e[0].height),line:0},Oa(this.ctx,t.textDirection);const v=f+d;this.legendItems.forEach((o,c)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+h+g;let k=u.x,w=u.y;l.setWidth(this.width),y?c>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ui(n,this.left+d,this.right-s[u.line])):c>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+d,u.line++,w=u.y=Ui(n,this.top+x+d,this.bottom-e[u.line].height));const C=l.x(k);if(m(C,w,o),k=Ii(f,k+p+h,y?k+_:this.right,t.rtl),b(l.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const t=r.lineHeight;u.y+=Fc(o,t)+d}else u.y+=v}),Ra(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=Un(e.font),i=En(e.padding);if(!e.display)return;const n=Ia(t.rtl,this.left,this.width),a=this.ctx,o=e.position,l=s.size/2,r=i.top+l;let d,c=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),d=this.top+r,c=Ui(t.align,c,this.right-h);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);d=r+Ui(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Ui(o,c,c+h);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Fn(a,e.text,u,d,s)}_computeTitleHeight(){const t=this.options.title,e=Un(t.font),s=En(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(wi(t,this.left,this.right)&&wi(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function Sc(t,e,s){let i=t;return"string"!==typeof e.text&&(i=Fc(e,s)),i}function Fc(t,e){const s=t.text?t.text.length:0;return e*s}function Tc(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var Pc={id:"legend",_element:kc,start(t,e,s){const i=t.legend=new kc({ctx:t.ctx,options:s,chart:t});Pl.configure(t,i,s),Pl.addBox(t,i)},stop(t){Pl.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Pl.configure(t,i,s),i.options=s},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const r=t.controller.getStyle(s?0:void 0),d=En(r.borderWidth);return{text:e[t.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const Mc={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,l=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function $c(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Vc(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:l}=e,r=Un(e.bodyFont),d=Un(e.titleFont),c=Un(e.footerFont),h=a.length,u=n.length,p=i.length,g=En(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,h&&(f+=h*d.lineHeight+(h-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*t+(b-p)*r.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=d.string,Vs(t.title,x),s.font=r.string,Vs(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,Vs(i,t=>{Vs(t.before,x),Vs(t.lines,x),Vs(t.after,x)}),y=0,s.font=c.string,Vs(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Lc(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Ec(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Uc(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=t;let d="center";return"center"===i?d=n<=(l+r)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Ec(d,t,e,s)&&(d="center"),d}function Ic(t,e,s){const i=s.yAlign||e.yAlign||Lc(t,s);return{xAlign:s.xAlign||e.xAlign||Uc(t,e,s,i),yAlign:i}}function Oc(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Rc(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Wc(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:l,yAlign:r}=s,d=n+a,{topLeft:c,topRight:h,bottomLeft:u,bottomRight:p}=Ln(o);let g=Oc(e,l);const f=Rc(e,r,d);return"center"===r?"left"===l?g+=d:"right"===l&&(g-=d):"left"===l?g-=Math.max(c,u)+n:"right"===l&&(g+=Math.max(h,p)+n),{x:_i(g,0,i.width-e.width),y:_i(f,0,i.height-e.height)}}function Bc(t,e,s){const i=En(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function Nc(t){return Dc([],Ac(t))}function zc(t,e,s){return Rn(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function jc(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const qc={beforeTitle:ks,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=jc(s,t);Dc(e.before,Ac(Hc(n,"beforeLabel",this,t))),Dc(e.lines,Hc(n,"label",this,t)),Dc(e.after,Ac(Hc(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return Nc(Hc(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=Hc(s,"beforeFooter",this,t),n=Hc(s,"footer",this,t),a=Hc(s,"afterFooter",this,t);let o=[];return o=Dc(o,Ac(i)),o=Dc(o,Ac(n)),o=Dc(o,Ac(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=e.length;ot.filter(e,i,n,s))),t.itemSort&&(r=r.sort((e,i)=>t.itemSort(e,i,s))),Vs(r,e=>{const s=jc(t.callbacks,e);i.push(Hc(s,"labelColor",this,e)),n.push(Hc(s,"labelPointStyle",this,e)),a.push(Hc(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=Mc[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=Vc(this,s),o=Object.assign({},t,e),l=Ic(this.chart,s,o),r=Wc(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:d,bottomRight:c}=Ln(o),{x:h,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=h,m=f-a,y=x+a,v=x-a):(f=h+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?h+Math.max(l,d)+a:"right"===i?h+p-Math.max(r,c)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=Ia(s.rtl,this.x,this.width);for(t.x=Bc(this,s.titleAlign,s),e.textAlign=r.textAlign(s.titleAlign),e.textBaseline="middle",a=Un(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Tn(t,{x:e,y:p,w:r,h:l,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Tn(t,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,r,l),t.strokeRect(e,p,r,l),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,r-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:d}=s,c=Un(s.bodyFont);let h=c.lineHeight,u=0;const p=Ia(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+h/2),t.y+=h+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=Bc(this,f,s),e.fillStyle=s.bodyColor,Vs(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+d:r+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,Vs(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),h=Math.max(c.lineHeight,l)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Mc[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Vc(this,t),o=Object.assign({},s,this._size),l=Ic(e,t,o),r=Wc(t,o,l,e);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=s,this.drawBackground(n,t,i,e),Oa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ra(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!Ls(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),l=e||!Ls(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=Mc[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,De.A)(Xc,"positioners",Mc);var Kc={id:"tooltip",_element:Xc,positioners:Mc,afterInit(t,e,s){s&&(t.tooltip=new Xc({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:qc},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Qc=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Yc(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Qc(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Gc=(t,e)=>null===t?null:_i(Math.round(t),0,e);function Jc(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function th(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:d,maxTicks:c,maxDigits:h,includeBounds:u}=t,p=a||1,g=c-1,{min:f,max:m}=e,b=!Cs(o),y=!Cs(l),x=!Cs(d),v=(m-f)/(h+1);let _,k,w,C,S=li((m-f)/g/p)*p;if(Sg&&(S=li(C*S/g/p)*p),Cs(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&hi((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,c)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:t})}return y&&u&&w!==l?s.length&&oi(s[s.length-1].value,l,eh(l,v,t))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function eh(t,e,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,De.A)(Zc,"id","category"),(0,De.A)(Zc,"defaults",{ticks:{callback:Jc}});class sh extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Cs(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=ai(i),e=ai(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=th(i,n);return"ticks"===t.bounds&&ui(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Zi(t,this.chart.options.locale,this.options.ticks.format)}}class ih extends sh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?t:0,this.max=Ts(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,De.A)(ih,"id","linear"),(0,De.A)(ih,"defaults",{ticks:{callback:sn.formatters.numeric}});const nh=t=>Math.floor(ni(t)),ah=(t,e)=>Math.pow(10,nh(t)+e);function oh(t){const e=t/Math.pow(10,nh(t));return 1===e}function lh(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function rh(t,e){const s=e-t;let i=nh(s);while(lh(t,e,i)>10)i++;while(lh(t,e,i)<10)i--;return Math.min(i,nh(t))}function dh(t,{min:e,max:s}){e=Ps(t.min,e);const i=[],n=nh(e);let a=rh(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,d=Math.round((e-r)*o)/o,c=Math.floor((e-r)/l/10)*l*10;let h=Math.floor((d-c)/Math.pow(10,a)),u=Ps(t.min,Math.round((r+c+h*Math.pow(10,a))*o)/o);while(u=10?h=h<15?15:20:h++,h>=20&&(a++,h=2,o=a>=0?1:o),u=Math.round((r+c+h*Math.pow(10,a))*o)/o;const p=Ps(t.max,u);return i.push({value:p,major:oh(p),significand:h}),i}class ch extends yr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=sh.prototype.parse.apply(this,[t,e]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?Math.max(0,t):null,this.max=Ts(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=t===ah(this.min,0)?ah(this.min,-1):ah(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(ah(s,-1)),a(ah(i,1)))),s<=0&&n(ah(i,-1)),i<=0&&a(ah(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dh(e,this);return"ticks"===t.bounds&&ui(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":Zi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ni(t),this._valueRange=ni(this.max)-ni(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ni(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function hh(t){const e=t.ticks;if(e.display&&t.display){const t=En(e.backdropPadding);return Ms(e.font&&e.font.size,cn.font.size)+t.height}return 0}function uh(t,e,s){return s=Ss(s)?s:[s],{w:pn(t,e.string,s),h:s.length*e.lineHeight}}function ph(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function gh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,l=o.centerPointLabels?Ys/a:0;for(let r=0;re.r&&(l=(i.end-e.r)/a,t.r=Math.max(t.r,e.r+l)),n.starte.b&&(r=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+r))}function mh(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=t.getPointPosition(e,i+n+o,a),d=Math.round(gi(xi(r.angle+ei))),c=_h(r.y,l.h,d),h=xh(d),u=vh(r.x,l.w,h);return{visible:!0,x:r.x,y:c,textAlign:h,left:u,top:c,right:u+l.w,bottom:c+l.h}}function bh(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=yn({x:s,y:i},e)||yn({x:s,y:a},e)||yn({x:n,y:i},e)||yn({x:n,y:a},e);return!o}function yh(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:hh(a)/2,additionalAngle:o?Ys/n:0};let d;for(let c=0;c270||s<90)&&(t-=e),t}function kh(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=e;if(!Cs(l)){const s=Ln(e.borderRadius),r=En(e.backdropPadding);t.fillStyle=l;const d=i-r.left,c=n-r.top,h=a-i+r.width,u=o-n+r.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Tn(t,{x:d,y:c,w:h,h:u,radius:s}),t.fill()):t.fillRect(d,c,h,u)}}function wh(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));kh(s,a,e);const o=Un(a.font),{x:l,y:r,textAlign:d}=e;Fn(s,t._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Ch(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,Gs);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?gh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(t*e+pi(s))}getDistanceFromCenterForValue(t){if(Cs(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Cs(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){l=this.getDistanceFromCenterForValue(t.value);const s=this.getContext(e),o=i.setContext(s),r=n.setContext(s);Sh(this,o,l,a,r)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),r=this.getPointPosition(o,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const l=s.setContext(this.getContext(o)),r=Un(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){t.font=r.string,a=t.measureText(i.label).width,t.fillStyle=l.backdropColor;const e=En(l.backdropPadding);t.fillRect(-a/2-e.left,-n-r.size/2-e.top,a+e.width,r.size+e.height)}Fn(t,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,De.A)(Th,"id","radialLinear"),(0,De.A)(Th,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,De.A)(Th,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,De.A)(Th,"descriptors",{angleLines:{_fallback:"grid"}});const Ph={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Mh=Object.keys(Ph);function Dh(t,e){return t-e}function Ah(t,e){if(Cs(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!ci(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $h(t,e,s,i){const n=Mh.length;for(let a=Mh.indexOf(t);a=Mh.indexOf(s);a--){const s=Mh[a];if(Ph[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return Mh[s?Mh.indexOf(s):0]}function Lh(t){for(let e=Mh.indexOf(t)+1,s=Mh.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Uh(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(e[r].major=!0);return e}function Ih(t,e,s){const i=[],n={},a=e.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$h(n.minUnit,e,s,this._getLabelCapacity(e)),o=Ms(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=ci(l)||!0===l,d={};let c,h,u=e;if(r&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,r?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(c=u,h=0;c+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[t,e,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,d=l&&o[l],c=r&&o[r],h=s[e],u=r&&c&&h&&h.major;return this._adapter.format(t,i||(u?c:d))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[l].pos&&e<=t[r].pos&&({lo:l,hi:r}=Si(t,"pos",e)),({pos:i,time:a}=t[l]),({pos:n,time:o}=t[r])):(e>=t[l].time&&e<=t[r].time&&({lo:l,hi:r}=Si(t,"time",e)),({time:i,pos:a}=t[l]),({time:n,pos:o}=t[r]));const d=n-i;return d?a+(o-a)*(e-i)/d:a}(0,De.A)(Oh,"id","time"),(0,De.A)(Oh,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class Wh extends Oh{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Rh(e,this.min),this._tableRange=Rh(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,l,r,d;for(a=0,o=t.length;a=e&&r<=s&&i.push(r);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Rh(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Rh(this._table,s*this._tableRange+this._minPos,!0)}}(0,De.A)(Wh,"id","timeseries"),(0,De.A)(Wh,"defaults",Oh.defaults);var Bh=s(90144);const Nh={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},zh={ariaLabel:{type:String},ariaDescribedby:{type:String}},jh={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Nh,...zh},qh="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Hh(t){return(0,Bh.ju)(t)?(0,Bh.ux)(t):t}function Xh(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Bh.ju)(e)?new Proxy(t,{}):t}function Kh(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Qh(t,e){t.labels=e}function Yh(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Gh(t,e){const s={labels:[],datasets:[]};return Qh(s,t.labels),Yh(s,t.datasets,e),s}const Jh=(0,i.pM)({props:jh,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Bh.KR)(null),o=(0,Bh.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:l}=t,r=Gh(s,l),d=Xh(r,s);o.value=new ld(a.value,{type:e,data:d,options:{...i},plugins:n})},r=()=>{const e=(0,Bh.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},d=e=>{e.update(t.updateMode)};return(0,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[l,r]=s;const c=(0,Bh.ux)(o.value);if(!c)return;let h=!1;if(n){const t=Hh(n),e=Hh(l);t&&t!==e&&(Kh(c,t),h=!0)}if(a){const e=Hh(a.labels),s=Hh(r.labels),i=Hh(a.datasets),n=Hh(r.datasets);e!==s&&(Qh(c.config.data,e),h=!0),i&&i!==n&&(Yh(c.config.data,i,t.datasetIdKey),h=!0)}h&&(0,i.dY)(()=>{d(c)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zh(t,e){return ld.register(e),(0,i.pM)({props:Nh,setup(e,s){let{expose:n}=s;const a=(0,Bh.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Jh,qh({ref:o},{type:t,...e}))}})}const tu=Zh("doughnut",Ko),eu=Zh("line",Qo);s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(t,e=""){if("AbortError"===t.name)return iu.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=iu[t.status];return s?s(e):new su(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?iu.NETWORK():new su(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return e}catch(a){const t=a instanceof su?a:nu(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Pe.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw nu(t,e)}const e=await t.json();if(!e.success)throw new su(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class lu{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Pe.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var ru=lu;class du{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:Me.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Pe.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var cu=du;class hu{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,d=0,c=0,h=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var uu=hu;ld.register(bd,Kc,Pc,Zc,ih,$d,Dd,xc);const pu=864e5;function gu(t){return String(t).padStart(2,"0")}function fu(t){return`${t.getFullYear()}-${gu(t.getMonth()+1)}-${gu(t.getDate())}`}function mu(){const t=new Date;t.setHours(0,0,0,0);const e=new Date(t.getTime()-6*pu);return[fu(e),fu(t)]}var bu={name:"SysCogStatus",components:{Doughnut:tu,Line:eu,DateRangeCalendar:H},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Me.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#2563EB","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},currentTrendGroup(){const t=this.indexInfo.uploadTrend||{},e=t.groupBy||{};return e[this.trendGroupBy]||{series:[]}},trendRawLabels(){const t=this.indexInfo.uploadTrend||{};return t.labels||[]},trendRangeCrossesYear(){const t=new Set;return this.trendRawLabels.forEach(e=>{this.extractTrendLabelDates(e).forEach(e=>t.add(e.year))}),t.size>1},trendDisplayLabels(){return this.trendRawLabels.map(t=>this.formatTrendAxisLabel(t))},hasTrendData(){const t=this.indexInfo.uploadTrend||{};return(t.labels||[]).length>0},trendDateDialogWidth(){return window.innerWidth>768?"420px":"90%"},uploadTrendChartData(){const t=this.indexInfo.uploadTrend||{},e=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:t.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...e.map((t,e)=>{const s=this.getTrendColor(e);return{label:this.formatTrendSeriesName(t),data:t.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const t="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:t}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:t=>{const e=t?.[0]?.dataIndex;return this.trendRawLabels[e]||""},label:t=>{const e=t.parsed||{},s=void 0!==e.y?e.y:t.raw;return` ${t.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:t,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:t,precision:0,callback:t=>Number(t).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},getTrendColor(t){return this.trendColors[t%this.trendColors.length]},formatTrendSeriesName(t){return t?.isOther||"__other__"===t?.name?this.$t("sysStatus.otherChannels"):t?.name||this.$t("sysStatus.unknown")},hexToRgba(t,e){const s=(t||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${e})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${e})`},extractTrendLabelDates(t){const e=String(t||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return e.map(t=>{const[e,s,i]=t.split("-").map(Number);return{year:e,month:s,day:i}})},formatTrendAxisLabel(t){const e=this.extractTrendLabelDates(t);if(0===e.length)return t;const s=(t,e)=>{const s=`${t.month}/${t.day}`;return e?`${t.year}/${s}`:s};if(1===e.length)return s(e[0],this.trendRangeCrossesYear);const[i,n]=e;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(t){Array.isArray(t)&&2===t.length&&t[0]&&t[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:t,endDate:e}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:t,trendEndDate:e}),i=await(0,Pe.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const t=await i.json();this.indexInfo=t}}catch(t){console.error("获取索引信息失败:",t),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new ru({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new cu({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,c.A)(bu,[["render",Te],["__scopeId","data-v-0f8731a4"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687)),Tu=(s(18785),s(97769));const Pu=["onClick"];function Mu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=Tu.A;return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>l.toggleDropdown&&l.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>l.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.channelType?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:e.channelType,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["type","class"])):e.icon?((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:e.icon,class:(0,n.C4)(["option-icon",e.iconClass])},null,8,["icon","class"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,Pu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",components:{ChannelIcon:Tu.A},props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const Au=(0,c.A)(Du,[["render",Mu],["__scopeId","data-v-8c87e03e"]]);var $u=Au;const Vu={class:"upload-settings"},Lu={class:"page-header"},Eu={class:"first-title"},Uu={class:"header-actions"},Iu={class:"group-header"},Ou={class:"group-title"},Ru={key:0,class:"load-balance-switch"},Wu={class:"switch-label"},Bu={key:0,class:"channel-cards"},Nu=["onMousemove","onMouseleave"],zu={class:"card-header"},ju={class:"card-title"},qu={class:"channel-name"},Hu={class:"card-body"},Xu={class:"card-info"},Ku={class:"info-item"},Qu={class:"info-text"},Yu={key:0,class:"info-item"},Gu={class:"info-text"},Ju={key:1,class:"info-item"},Zu=["title"],tp={class:"info-item"},ep={class:"info-text"},sp={key:0,class:"info-item"},ip=["title"],np={class:"info-item"},ap={class:"info-text"},op={class:"info-item"},lp={class:"info-text"},rp={class:"info-item"},dp={class:"info-text"},cp={class:"info-item"},hp=["title"],up={key:0,class:"info-item"},pp=["title"],gp={key:0,class:"quota-mini"},fp={class:"quota-text"},mp={class:"card-actions"},bp={key:1,class:"empty-tip"},yp={class:"channel-type-option"},xp={key:0,class:"form-warning",style:{"margin-top":"0"}},vp=["innerHTML"],_p={class:"form-warning"},kp={class:"quota-label"},wp={class:"quota-status"};function Cp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=$u,h=K.S2,u=Tu.A,p=Fu.u,f=Su.qi,m=k.ve,b=Cu.P9,y=Cu.AV,x=_u.xE,_=wu.WK,S=ku.lq,F=_u.US,T=w.kZ,P=vu.MF,M=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Vu,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Eu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Uu,[(0,i.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:l.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(h,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Iu,[(0,i.Lk)("div",Ou,[(0,i.bF)(u,{type:s.value,class:"group-icon"},null,8,["type"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(p,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ru,[(0,i.Lk)("span",Wu,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(f,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>l.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Bu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>l.handleCardMouseMove(t,s.value,o),onMouseleave:t=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",zu,[(0,i.Lk)("div",ju,[(0,i.Lk)("span",qu,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(f,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,C.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",Hu,[(0,i.Lk)("div",Xu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Ku,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Qu,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Gu,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Ju,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Zu)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",tp,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",ep,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",sp,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,ip)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",np,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",ap,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",op,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",lp,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",dp,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",cp,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",up,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,pp)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",gp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",fp,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",mp,[(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:t=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"danger",size:"small",onClick:t=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Nu))),128))])):((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(T,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(y,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(b,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.Lk)("span",yp,[(0,i.bF)(u,{type:t.value,class:"select-option-icon"},null,8,["type"]),(0,i.Lk)("span",null,(0,n.v_)(t.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",xp,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,vp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameImmutableTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"])]),_:1}),(0,i.Lk)("div",_p,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(M,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(P,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(P,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(P,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(P,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(P,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(P,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(P,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(P,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(P,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(P,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",kp,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(h,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",wp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.channelNameEditDisabledTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(x,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var Sp={components:{ChannelIcon:Tu.A,CustomSelect:$u},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){return[{value:"",label:this.$t("common.all")},...this.channels.map(t=>({value:t.value,label:t.label,channelType:t.value}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,l=`glow-${e}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.currentChannelIndex,i=e.channels[s]?.name||this.editChannel.name,n={...this.editChannel,name:i};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(n.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));n.headers=t,n.createDirectory=!1!==n.createDirectory,delete n.headersText}e.channels[this.currentChannelIndex]=n,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.warning"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Pe.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Pe.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Fp=(0,c.A)(Sp,[["render",Cp],["__scopeId","data-v-0082a519"]]);var Tp=Fp,Pp=s(98469);s(49187);const Mp={class:"save-text"};function Dp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>l.handleClick&&l.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",Mp,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Ap={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const $p=(0,c.A)(Ap,[["render",Dp],["__scopeId","data-v-9cef95d2"]]);var Vp=$p,Lp=s(84757);s(5802),s(64752),s(38736);const Ep={class:"security-settings"},Up={class:"first-settings"},Ip={class:"first-title"},Op={class:"second-title"},Rp={style:{display:"flex",gap:"8px",width:"100%"}},Wp={class:"second-title"},Bp={style:{display:"flex",gap:"8px",width:"100%"}},Np={class:"second-title token-title"},zp={class:"token-actions"},jp={class:"token-table-container"},qp={class:"table-cell-content"},Hp={class:"table-cell-content"},Xp={class:"token-display"},Kp={class:"table-cell-content"},Qp={class:"table-cell-content"},Yp={class:"table-cell-content"},Gp={class:"table-cell-content"},Jp={class:"table-cell-content action-buttons"},Zp={class:"first-settings"},tg={class:"first-title"},eg={class:"second-title"},sg={class:"second-title"},ig={class:"query-param-list"},ng={class:"query-param-list"},ag={class:"first-settings"},og={class:"first-title"},lg={class:"second-title"},rg={class:"second-title"},dg={class:"second-title"},cg={class:"form-item-hint"},hg={class:"form-item-hint"},ug={style:{display:"flex",gap:"10px",width:"100%"}},pg={class:"dialog-footer"},gg={style:{display:"flex",gap:"10px",width:"100%"}},fg={class:"dialog-footer"},mg={class:"token-result"},bg={style:{"margin-bottom":"15px",color:"#e6a23c"}},yg={class:"dialog-footer"};function xg(t,e,s,a,o,l){const r=wu.WK,d=Pp.dI,c=_u.xE,h=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Lp.o8,m=Fu.u,b=Lp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Vp,T=Pp.o5,P=w.kZ,M=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ep,[(0,i.Lk)("div",Up,[(0,i.Lk)("h3",Ip,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Op,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(h,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Rp,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Wp,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(h,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Bp,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Np,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",zp,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",jp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",qp,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Hp,[(0,i.Lk)("span",Xp,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Kp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Qp,(0,n.v_)(l.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Yp,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Gp,(0,n.v_)(l.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Jp,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>l.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>l.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[M,o.tokenLoading]])])]),(0,i.Lk)("div",Zp,[(0,i.Lk)("h3",tg,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",eg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"]),(0,i.Lk)("h4",sg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.ipQuery"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.ipQueryTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.ipQuery,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.enableIpQuery")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.ipQuery.enabled,"onUpdate:modelValue":e[12]||(e[12]=t=>o.uploadSettings.ipQuery.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.ipQueryChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.ipQuery.channel,"onUpdate:modelValue":e[13]||(e[13]=t=>o.uploadSettings.ipQuery.channel=t),placeholder:t.$t("sysSecurity.ipQueryChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:t.$t("sysSecurity.customApi"),value:"customApi"},null,8,["label"])]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"customApi"===o.uploadSettings.ipQuery.channel?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(c,{label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.url,"onUpdate:modelValue":e[14]||(e[14]=t=>o.uploadSettings.ipQuery.customApi.url=t),placeholder:"https://api.example.com/ip"},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.queryParams")},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ig,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.params,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"query-param-row"},[(0,i.bF)(r,{modelValue:e.key,"onUpdate:modelValue":t=>e.key=t,placeholder:t.$t("sysSecurity.paramNamePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(r,{modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,placeholder:t.$t("sysSecurity.paramValuePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryParam(s),disabled:o.uploadSettings.ipQuery.customApi.params.length<=1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryParam},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addQueryParam")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"]),(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.responseFields"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.responseFieldsTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",ng,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.responseFields,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"response-field-row"},[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.responseFields[s],"onUpdate:modelValue":t=>o.uploadSettings.ipQuery.customApi.responseFields[s]=t,placeholder:t.$t("sysSecurity.responseFieldPathPlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,-1),disabled:0===s},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-up"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{plain:"",circle:"",onClick:t=>l.moveIpQueryResponseField(s,1),disabled:s===o.uploadSettings.ipQuery.customApi.responseFields.length-1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-down"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:t=>l.removeIpQueryResponseField(s)},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryResponseField},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysSecurity.addResponseField")),1)]),_:1},8,["onClick"])])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",ag,[(0,i.Lk)("h3",og,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",lg,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",rg,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(h,{model:o.accessSettings,rules:l.accessRules,ref:"accessForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",dg,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[17]||(e[17]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(c,{label:t.$t("sysSecurity.userSessionMaxAge"),prop:"userSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[18]||(e[18]=t=>o.accessSettings.userSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",cg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.adminSessionMaxAge"),prop:"adminSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[19]||(e[19]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",hg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(P,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[27]||(e[27]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",pg,[(0,i.bF)(p,{onClick:e[26]||(e[26]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.neverExpire=t),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ug,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",fg,[(0,i.bF)(p,{onClick:e[34]||(e[34]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.neverExpire=t),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",gg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[31]||(e[31]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[32]||(e[32]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[33]||(e[33]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[38]||(e[38]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",yg,[(0,i.bF)(p,{type:"primary",onClick:e[37]||(e[37]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.Lk)("p",bg,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(h,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[36]||(e[36]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[M,o.loading]])}s(81148);const vg={s:1e3,m:6e4,h:36e5,d:864e5};function _g(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(vg[s])return new Date(i.getTime()+e*vg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function kg(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function wg(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=kg(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Cg={components:{FloatingSaveButton:Vp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{},ipQuery:{enabled:!1,channel:"customApi",customApi:{url:"",params:[{key:"ip",value:"{ip}"}],responseFields:[]}}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},accessRules(){const t=(t,e,s)=>{!Number.isInteger(e)||e<1||e>3650?s(new Error(this.$t("sysSecurity.sessionMaxAgeInvalid"))):s()};return{userSessionMaxAge:[{validator:t,trigger:"change"}],adminSessionMaxAge:[{validator:t,trigger:"change"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},methods:{normalizeIpQuerySettings(t={}){const e=t.ipQuery||{},s=e.customApi||{},i=Array.isArray(s.params)&&s.params.length>0?s.params.map(t=>({key:t?.key||"",value:t?.value||""})):[{key:"ip",value:"{ip}"}],n=Array.isArray(s.responseFields)?s.responseFields.map(t=>"string"===typeof t?t:t?.path||""):[];return{...t,moderate:t.moderate||{},ipQuery:{enabled:e.enabled??!1,channel:e.channel||"customApi",customApi:{url:s.url||"",params:i,responseFields:n}}}},addIpQueryParam(){this.uploadSettings.ipQuery.customApi.params.push({key:"",value:""})},removeIpQueryParam(t){this.uploadSettings.ipQuery.customApi.params.length<=1||this.uploadSettings.ipQuery.customApi.params.splice(t,1)},addIpQueryResponseField(){this.uploadSettings.ipQuery.customApi.responseFields.push("")},removeIpQueryResponseField(t){this.uploadSettings.ipQuery.customApi.responseFields.splice(t,1)},moveIpQueryResponseField(t,e){const s=this.uploadSettings.ipQuery.customApi.responseFields,i=t+e;if(i<0||i>=s.length)return;const[n]=s.splice(t,1);s.splice(i,0,n)},handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Pe.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=_g(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=_g(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Pe.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return wg(t)},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.accessForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.userSessionMaxAge>3650||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge)||this.accessSettings.adminSessionMaxAge>3650)return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Pe.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=this.normalizeIpQuerySettings(t.upload),this.accessSettings=t.access,this.oriUserPassword="",this.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Sg=(0,c.A)(Cg,[["render",xg],["__scopeId","data-v-06fad51f"]]);var Fg=Sg;const Tg={class:"page-settings"},Pg={class:"first-title"},Mg={key:5,class:"announcement-refresh-option"};function Dg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Cu.P9,h=Cu.AV,u=Su.qi,p=wu.WK,f=Pp.dI,m=_u.xE,b=_u.US,y=Vp,x=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Tg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(s,a)=>((0,i.uX)(),(0,i.CE)("div",{key:a,class:"first-settings"},[(0,i.Lk)("h3",Pg,(0,n.v_)(a),1),(0,i.bF)(b,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s,(s,a)=>((0,i.uX)(),(0,i.Wv)(m,{key:s.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(s,"label"))+" ",1),s.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:l.localized(s,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.value,label:l.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:1,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(c,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===s.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===s.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,type:"textarea",autosize:{minRows:2,maxRows:"announcement"===s.id?8:void 0},resize:"vertical",disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","autosize","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:s.value,"onUpdate:modelValue":t=>s.value=t,disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])),"announcement"===s.id?((0,i.uX)(),(0,i.CE)("div",Mg,[(0,i.bF)(f,{modelValue:o.refreshAnnouncement,"onUpdate:modelValue":e[0]||(e[0]=t=>o.refreshAnnouncement=t)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysPage.refreshAnnouncement")),1)]),_:1},8,["modelValue"])])):(0,i.Q3)("",!0)]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(y,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[x,o.loading]])}var Ag=s(457),$g={components:{FloatingSaveButton:Vp},data(){return{settings:{config:[]},loading:!0,refreshAnnouncement:!1,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Pe.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...this.settings,refreshAnnouncement:this.refreshAnnouncement})}).then(()=>{this.refreshAnnouncement=!1,this.$message.success(this.$t("sysPage.settingsSaved"))})},async fetchAvailableChannels(){try{const t=await Ag.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Pe.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Vg=(0,c.A)($g,[["render",Dg],["__scopeId","data-v-9331dab2"]]);var Lg=Vg;const Eg={class:"others-settings"},Ug={class:"first-settings"},Ig={class:"first-title"},Og={class:"first-title"},Rg={class:"first-title"},Wg={class:"first-title"},Bg=["innerHTML"],Ng={class:"first-title"};function zg(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Su.qi,h=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Eg,[(0,i.Lk)("div",Ug,[(0,i.Lk)("h3",Ig,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Og,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Rg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Wg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,Bg)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Ng,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var jg={components:{FloatingSaveButton:Vp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Pe.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Pe.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const qg=(0,c.A)(jg,[["render",zg],["__scopeId","data-v-69ae97d8"]]);var Hg=qg,Xg=s(48903),Kg={name:"SystemConfig",mixins:[Xg.A],data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:xu,SysCogUpload:Tp,SysCogSecurity:Fg,SysCogPage:Lg,SysCogOthers:Hg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return xu;case"upload":return Tp;case"security":return Fg;case"page":return Lg;case"others":return Hg;default:return xu}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Qg=(0,c.A)(Kg,[["render",x],["__scopeId","data-v-5c6339bf"]]);var Yg=Qg},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},97769:function(t,e,s){s.d(e,{A:function(){return h}});var i=s(56768);const n={key:0,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},a={key:1,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},o={key:2,class:"channel-svg-icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"};function l(t,e,s,l,r,d){const c=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("span",(0,i.v6)(t.$attrs,{class:["channel-icon-wrapper",`channel-brand-${s.type}`]}),["telegram"===s.type?((0,i.uX)(),(0,i.CE)("svg",n,[...e[0]||(e[0]=[(0,i.Lk)("path",{d:"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z"},null,-1)])])):"huggingface"===s.type?((0,i.uX)(),(0,i.CE)("svg",a,[...e[1]||(e[1]=[(0,i.Fv)('',9)])])):"webdav"===s.type?((0,i.uX)(),(0,i.CE)("svg",o,[...e[2]||(e[2]=[(0,i.Lk)("path",{d:"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z"},null,-1)])])):((0,i.uX)(),(0,i.Wv)(c,{key:3,icon:d.fontAwesomeIcon},null,8,["icon"]))],16)}var r={name:"ChannelIcon",inheritAttrs:!1,props:{type:{type:String,required:!0}},computed:{fontAwesomeIcon(){const t={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return t[this.type]||"server"}}},d=s(71241);const c=(0,d.A)(r,[["render",l],["__scopeId","data-v-ce6ff2ce"]]);var h=c},98642:function(t,e,s){s(85331)}}]); -//# sourceMappingURL=183.37299d64.js.map \ No newline at end of file diff --git a/frontend-dist/js/183.37299d64.js.gz b/frontend-dist/js/183.37299d64.js.gz deleted file mode 100644 index e9c271cb30104bad8980a6c30eced74e5d711200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106553 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 z 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 diff --git a/frontend-dist/js/183.37299d64.js.map b/frontend-dist/js/183.37299d64.js.map deleted file mode 100644 index d46d7282..00000000 --- a/frontend-dist/js/183.37299d64.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/183.37299d64.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?76ad","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?8a06","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?f721","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?7c9a","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?6d2d","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.segment.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.helper.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.options.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.stack.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/simpleArc.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.drawing.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/index.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?9d4a","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?f46d","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?2ea5","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?6df0","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?60ed","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?c551","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?3436","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05"],"sourcesContent":["import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }]),\n ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=5cddfe48&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=5cddfe48&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5cddfe48\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content admin-header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=5fbe496c&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=5fbe496c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5fbe496c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#2563EB', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=0f8731a4&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=0f8731a4&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0f8731a4\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=8c87e03e&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=8c87e03e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-8c87e03e\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: \"group-icon\"\n }, null, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: \"select-option-icon\"\n }, null, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=0082a519&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=0082a519&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0082a519\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=9cef95d2&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=9cef95d2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9cef95d2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=06fad51f&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=06fad51f&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-06fad51f\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n key: 5,\n class: \"announcement-refresh-option\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2,\n maxRows: setting.id === 'announcement' ? 8 : undefined\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"autosize\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])), setting.id === 'announcement' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_el_checkbox, {\n modelValue: $data.refreshAnnouncement,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.refreshAnnouncement = $event)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysPage.refreshAnnouncement')), 1)]),\n _: 1\n }, 8, [\"modelValue\"])])) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 即使公告内容未变化,也在本次保存时刷新公告已读状态\n refreshAnnouncement: false,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n ...this.settings,\n refreshAnnouncement: this.refreshAnnouncement\n })\n }).then(() => {\n this.refreshAnnouncement = false;\n this.$message.success(this.$t('sysPage.settingsSaved'));\n });\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=9331dab2&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=9331dab2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9331dab2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=69ae97d8&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=69ae97d8&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-69ae97d8\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=5c6339bf&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"@/styles/admin-pagination.css?vue&type=style&index=0&id=5c6339bf&scoped=true&lang=css&external\"\nimport \"./SystemConfig.vue?vue&type=style&index=1&id=5c6339bf&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c6339bf\"]])\n\nexport default __exports__","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: ['channel-icon-wrapper', `channel-brand-${$props.type}`]\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=ce6ff2ce&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=ce6ff2ce&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ce6ff2ce\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","_defineProperty","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","cfr2","s3","discord","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","maxRows","refreshAnnouncement","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","_typeof","iterator","toPropertyKey","viewBox","xmlns","$attrs","fontAwesomeIcon","inheritAttrs","icons"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/183.37299d64.js.map.gz b/frontend-dist/js/183.37299d64.js.map.gz deleted file mode 100644 index 1ee4acc61cf37066c16cfe33d664f9271b3bd652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365171 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%0Db6 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

OsASQwx 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�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',9)])])):"webdav"===s.type?((0,i.uX)(),(0,i.CE)("svg",o,[...t[2]||(t[2]=[(0,i.Lk)("path",{d:"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z"},null,-1)])])):((0,i.uX)(),(0,i.Wv)(c,{key:3,icon:d.fontAwesomeIcon},null,8,["icon"]))],16)}var r={name:"ChannelIcon",inheritAttrs:!1,props:{type:{type:String,required:!0}},computed:{fontAwesomeIcon(){const e={cfr2:["fab","cloudflare"],s3:["fab","aws"],discord:["fab","discord"]};return e[this.type]||"server"}}},d=s(71241);const c=(0,d.A)(r,[["render",l],["__scopeId","data-v-ce6ff2ce"]]);var h=c},98642:function(e,t,s){s(85331)},98719:function(e,t,s){s.r(t),s.d(t,{default:function(){return Yg}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(e,t,s,r,d,c){const h=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(c.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.menuItems,t=>((0,i.uX)(),(0,i.CE)("div",{key:t.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===t.index}]),onClick:e=>c.handleSelect(t.index)},[(0,i.bF)(h,{icon:t.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(e.$t(t.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:t[0]||(t[0]=(...e)=>c.toggleCollapse&&c.toggleCollapse(...e))},[(0,i.bF)(h,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const e=window.innerWidth<=768;this.$emit("update:isCollapse",e)},handleSelect(e){this.$emit("update:activeIndex",e)},measureWidth(){const e=this.$refs.sidebar;if(!e)return;const t=e.style.width,s=e.style.transition,i=e.classList.contains("is-collapsed");e.style.transition="none",i&&e.classList.remove("is-collapsed"),e.style.width="auto",e.offsetWidth;const n=e.scrollWidth;e.style.width=t,i&&e.classList.add("is-collapsed"),e.offsetWidth,e.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=s(71241);const h=(0,c.A)(d,[["render",r],["__scopeId","data-v-5cddfe48"]]);var u=h,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(91570));const m={class:"container"},b={class:"header-content admin-header-content"},y={class:"header-action"};function x(e,t,s,a,o,l){const r=f.A,d=(0,i.g2)("font-awesome-icon"),c=g.R7,h=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(c,{disabled:l.disableTooltip,content:e.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{activeIndex:o.activeIndex,"onUpdate:activeIndex":t[0]||(t[0]=e=>o.activeIndex=e),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":t[1]||(t[1]=e=>o.isSidebarCollapse=e)},null,8,["activeIndex","isCollapse"]),((0,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},M=["aria-label"],P={class:"date-range-separator"},D=["aria-label"],A={class:"calendar-header"},$=["aria-label"],V={class:"calendar-title"},L=["aria-label"],E={class:"calendar-weekdays"},U={class:"calendar-grid"},I=["onClick"];function O(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>o.inputStart=e),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.startDateLabel,onChange:t[1]||(t[1]=(...e)=>l.handleManualInput&&l.handleManualInput(...e))},null,40,M),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",P,(0,n.v_)(l.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":t[2]||(t[2]=e=>o.inputEnd=e),class:"date-input",type:"text",inputmode:"numeric","aria-label":l.endDateLabel,onChange:t[3]||(t[3]=(...e)=>l.handleManualInput&&l.handleManualInput(...e))},null,40,D),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.previousMonthLabel,onClick:t[4]||(t[4]=(...e)=>l.goToPreviousMonth&&l.goToPreviousMonth(...e))},[(0,i.bF)(r,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",V,(0,n.v_)(l.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":l.nextMonthLabel,onClick:t[5]||(t[5]=(...e)=>l.goToNextMonth&&l.goToNextMonth(...e))},[(0,i.bF)(r,{icon:"chevron-right"})],8,L)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.weekdayLabels,e=>((0,i.uX)(),(0,i.CE)("span",{key:e},(0,n.v_)(e),1))),128))]),(0,i.Lk)("div",U,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.calendarDays,e=>((0,i.uX)(),(0,i.CE)("button",{key:e.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!e.isCurrentMonth,"is-today":e.isToday,"is-range-start":e.key===o.draftStart,"is-range-end":e.key===o.draftEnd,"is-in-range":l.isInRange(e.key)}]),onClick:t=>l.selectDay(e.key)},(0,n.v_)(e.dayOfMonth),11,I))),128))])])}const R=864e5;function W(e){return String(e).padStart(2,"0")}function B(e){return`${e.getFullYear()}-${W(e.getMonth()+1)}-${W(e.getDate())}`}function z(e){if("string"!==typeof e)return null;const t=e.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!t)return null;const s=Number(t[1]),i=Number(t[2])-1,n=Number(t[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function N(e,t){return new Date(e.getFullYear(),e.getMonth()+t,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const e=new Date;return e.setHours(0,0,0,0),{displayYear:e.getFullYear(),displayMonth:e.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const e=new Date(this.displayYear,this.displayMonth,1),t=new Date(this.displayYear,this.displayMonth,1-e.getDay()),s=B(new Date);return Array.from({length:42},(e,i)=>{const n=new Date(t.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(e){this.syncFromModel(e)}}},methods:{syncFromModel(e){const t=z(e?.[0]),s=z(e?.[1]);this.draftStart=t?B(t):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=t||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const e=N(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=e.getFullYear(),this.displayMonth=e.getMonth()},goToNextMonth(){const e=N(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=e.getFullYear(),this.displayMonth=e.getMonth()},selectDay(e){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=e,this.draftEnd="",this.inputStart=e,this.inputEnd="",void(this.awaitingEnd=!0);const t=ethis.draftStart&&el.fetchIndexInfo&&l.fetchIndexInfo(...e))},[(0,i.Lk)("div",G,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(e.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",ee,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",te,(0,n.v_)(e.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",se,[(0,i.Lk)("div",ie,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",ne,[(0,i.Lk)("div",ae,(0,n.v_)(e.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",oe,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",le,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:t[1]||(t[1]=(...e)=>l.openReleases&&l.openReleases(...e))},[(0,i.Lk)("div",re,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",de,[(0,i.Lk)("div",ce,(0,n.v_)(e.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",he,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ue,(0,n.v_)(e.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pe,[(0,i.Lk)("div",ge,[(0,i.Lk)("div",fe,[(0,i.Lk)("div",me,[(0,i.bF)(r,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":e.$t("sysStatus.selectDateRange"),onClick:l.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",be,[(0,i.bF)(h,{modelValue:o.trendGroupBy,"onUpdate:modelValue":t[2]||(t[2]=e=>o.trendGroupBy=e),size:"small",class:"trend-group-switch","aria-label":e.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(c,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":t[4]||(t[4]=e=>o.trendDatePickerVisible=e),title:e.$t("sysStatus.selectDateRange"),width:l.trendDateDialogWidth,class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ye,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":t[3]||(t[3]=e=>o.trendDateRange=e),onChange:l.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title","width"]),(0,i.Lk)("div",xe,[l.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_e,[(0,i.bF)(f,{data:l.uploadTrendChartData,options:l.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",ve,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",ke,[(0,i.Lk)("div",we,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ce,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Se,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Fe,[(0,i.Lk)("div",Te,[(0,i.bF)(m,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Me,[(0,i.Lk)("div",Pe,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",De,(0,n.v_)(e.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",Ae,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(e,t,s)=>((0,i.uX)(),(0,i.CE)("div",{key:t,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",$e,(0,n.v_)(t),1),(0,i.Lk)("span",Ve,(0,n.v_)(e.toLocaleString()),1),(0,i.Lk)("span",Le,(0,n.v_)(l.getPercentage(e,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Ee,[(0,i.Lk)("div",Ue,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",Ie,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Oe,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Re,[(0,i.Lk)("div",We,[(0,i.bF)(m,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Be,[(0,i.Lk)("div",ze,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",Ne,(0,n.v_)(e.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",je,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(e,t,s)=>((0,i.uX)(),(0,i.CE)("div",{key:t,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",He,(0,n.v_)(t),1),(0,i.Lk)("span",qe,(0,n.v_)(e.toLocaleString()),1),(0,i.Lk)("span",Xe,(0,n.v_)(l.getPercentage(e,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Ke,[(0,i.Lk)("div",Qe,[(0,i.Lk)("div",Ye,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Ge,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Je,[(0,i.Lk)("div",Ze,[(0,i.Lk)("span",et,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",tt,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",st,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",it,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(e.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",nt,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",at,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(e.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",ot,[(0,i.Lk)("div",lt,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",rt,[(0,i.Lk)("div",dt,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",ct,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",ht,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(e.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ut,[(0,i.bF)(y,{content:e.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?e.$t("sysStatus.rebuilding"):e.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:e.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?e.$t("sysStatus.backingUp"):e.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:e.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pt,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:t[5]||(t[5]=(...e)=>l.handleFileSelect&&l.handleFileSelect(...e)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?e.$t("sysStatus.restoring"):e.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",gt,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:t[8]||(t[8]=e=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:t[6]||(t[6]=e=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:t[7]||(t[7]=e=>l.handleImageError("newest"))},null,40,ft)):((0,i.uX)(),(0,i.CE)("div",mt,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",bt,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",yt,[(0,i.Lk)("div",xt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",vt,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:t[11]||(t[11]=e=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:t[9]||(t[9]=e=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:t[10]||(t[10]=e=>l.handleImageError("oldest"))},null,40,_t)):((0,i.uX)(),(0,i.CE)("div",kt,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",wt,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ct,[(0,i.Lk)("div",St,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Ft,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698);var Mt=s(70797),Pt={rE:"2.7.5"},Dt=(s(20116),s(91114));s(22489),s(13579); +/*! + * @kurkle/color v0.3.4 + * https://github.com/kurkle/color#readme + * (c) 2024 Jukka Kurkela + * Released under the MIT License + */ +function At(e){return e+.5|0}const $t=(e,t,s)=>Math.max(Math.min(e,s),t);function Vt(e){return $t(At(2.55*e),0,255)}function Lt(e){return $t(At(255*e),0,255)}function Et(e){return $t(At(e/2.55)/100,0,1)}function Ut(e){return $t(At(100*e),0,100)}const It={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ot=[..."0123456789ABCDEF"],Rt=e=>Ot[15&e],Wt=e=>Ot[(240&e)>>4]+Ot[15&e],Bt=e=>(240&e)>>4===(15&e),zt=e=>Bt(e.r)&&Bt(e.g)&&Bt(e.b)&&Bt(e.a);function Nt(e){var t,s=e.length;return"#"===e[0]&&(4===s||5===s?t={r:255&17*It[e[1]],g:255&17*It[e[2]],b:255&17*It[e[3]],a:5===s?17*It[e[4]]:255}:7!==s&&9!==s||(t={r:It[e[1]]<<4|It[e[2]],g:It[e[3]]<<4|It[e[4]],b:It[e[5]]<<4|It[e[6]],a:9===s?It[e[7]]<<4|It[e[8]]:255})),t}const jt=(e,t)=>e<255?t(e):"";function Ht(e){var t=zt(e)?Rt:Wt;return e?"#"+t(e.r)+t(e.g)+t(e.b)+jt(e.a,t):void 0}const qt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Xt(e,t,s){const i=t*Math.min(s,1-s),n=(t,n=(t+e/30)%12)=>s-i*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Kt(e,t,s){const i=(i,n=(i+e/60)%6)=>s-s*t*Math.max(Math.min(n,4-n,1),0);return[i(5),i(3),i(1)]}function Qt(e,t,s){const i=Xt(e,1,.5);let n;for(t+s>1&&(n=1/(t+s),t*=n,s*=n),n=0;n<3;n++)i[n]*=1-t-s,i[n]+=t;return i}function Yt(e,t,s,i,n){return e===n?(t-s)/i+(t.5?c/(2-a-o):c/(a+o),r=Yt(s,i,n,c,a),r=60*r+.5),[0|r,d||0,l]}function Jt(e,t,s,i){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,s,i)).map(Lt)}function Zt(e,t,s){return Jt(Xt,e,t,s)}function es(e,t,s){return Jt(Qt,e,t,s)}function ts(e,t,s){return Jt(Kt,e,t,s)}function ss(e){return(e%360+360)%360}function is(e){const t=qt.exec(e);let s,i=255;if(!t)return;t[5]!==s&&(i=t[6]?Vt(+t[5]):Lt(+t[5]));const n=ss(+t[2]),a=+t[3]/100,o=+t[4]/100;return s="hwb"===t[1]?es(n,a,o):"hsv"===t[1]?ts(n,a,o):Zt(n,a,o),{r:s[0],g:s[1],b:s[2],a:i}}function ns(e,t){var s=Gt(e);s[0]=ss(s[0]+t),s=Zt(s),e.r=s[0],e.g=s[1],e.b=s[2]}function as(e){if(!e)return;const t=Gt(e),s=t[0],i=Ut(t[1]),n=Ut(t[2]);return e.a<255?`hsla(${s}, ${i}%, ${n}%, ${Et(e.a)})`:`hsl(${s}, ${i}%, ${n}%)`}const os={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},ls={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function rs(){const e={},t=Object.keys(ls),s=Object.keys(os);let i,n,a,o,l;for(i=0;i>16&255,a>>8&255,255&a]}return e}let ds;function cs(e){ds||(ds=rs(),ds.transparent=[0,0,0,0]);const t=ds[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:4===t.length?t[3]:255}}const hs=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function us(e){const t=hs.exec(e);let s,i,n,a=255;if(t){if(t[7]!==s){const e=+t[7];a=t[8]?Vt(e):$t(255*e,0,255)}return s=+t[1],i=+t[3],n=+t[5],s=255&(t[2]?Vt(s):$t(s,0,255)),i=255&(t[4]?Vt(i):$t(i,0,255)),n=255&(t[6]?Vt(n):$t(n,0,255)),{r:s,g:i,b:n,a:a}}}function ps(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${Et(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}const gs=e=>e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055,fs=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function ms(e,t,s){const i=fs(Et(e.r)),n=fs(Et(e.g)),a=fs(Et(e.b));return{r:Lt(gs(i+s*(fs(Et(t.r))-i))),g:Lt(gs(n+s*(fs(Et(t.g))-n))),b:Lt(gs(a+s*(fs(Et(t.b))-a))),a:e.a+s*(t.a-e.a)}}function bs(e,t,s){if(e){let i=Gt(e);i[t]=Math.max(0,Math.min(i[t]+i[t]*s,0===t?360:1)),i=Zt(i),e.r=i[0],e.g=i[1],e.b=i[2]}}function ys(e,t){return e?Object.assign(t||{},e):e}function xs(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=Lt(e[3]))):(t=ys(e,{r:0,g:0,b:0,a:1}),t.a=Lt(t.a)),t}function vs(e){return"r"===e.charAt(0)?us(e):is(e)}class _s{constructor(e){if(e instanceof _s)return e;const t=typeof e;let s;"object"===t?s=xs(e):"string"===t&&(s=Nt(e)||cs(e)||vs(e)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var e=ys(this._rgb);return e&&(e.a=Et(e.a)),e}set rgb(e){this._rgb=xs(e)}rgbString(){return this._valid?ps(this._rgb):void 0}hexString(){return this._valid?Ht(this._rgb):void 0}hslString(){return this._valid?as(this._rgb):void 0}mix(e,t){if(e){const s=this.rgb,i=e.rgb;let n;const a=t===n?.5:t,o=2*a-1,l=s.a-i.a,r=((o*l===-1?o:(o+l)/(1+o*l))+1)/2;n=1-r,s.r=255&r*s.r+n*i.r+.5,s.g=255&r*s.g+n*i.g+.5,s.b=255&r*s.b+n*i.b+.5,s.a=a*s.a+(1-a)*i.a,this.rgb=s}return this}interpolate(e,t){return e&&(this._rgb=ms(this._rgb,e._rgb,t)),this}clone(){return new _s(this.rgb)}alpha(e){return this._rgb.a=Lt(e),this}clearer(e){const t=this._rgb;return t.a*=1-e,this}greyscale(){const e=this._rgb,t=At(.3*e.r+.59*e.g+.11*e.b);return e.r=e.g=e.b=t,this}opaquer(e){const t=this._rgb;return t.a*=1+e,this}negate(){const e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return bs(this._rgb,2,e),this}darken(e){return bs(this._rgb,2,-e),this}saturate(e){return bs(this._rgb,1,e),this}desaturate(e){return bs(this._rgb,1,-e),this}rotate(e){return ns(this._rgb,e),this}} +/*! + * Chart.js v4.5.1 + * https://www.chartjs.org + * (c) 2025 Chart.js Contributors + * Released under the MIT License + */ +function ks(){}const ws=(()=>{let e=0;return()=>e++})();function Cs(e){return null===e||void 0===e}function Ss(e){if(Array.isArray&&Array.isArray(e))return!0;const t=Object.prototype.toString.call(e);return"[object"===t.slice(0,7)&&"Array]"===t.slice(-6)}function Fs(e){return null!==e&&"[object Object]"===Object.prototype.toString.call(e)}function Ts(e){return("number"===typeof e||e instanceof Number)&&isFinite(+e)}function Ms(e,t){return Ts(e)?e:t}function Ps(e,t){return"undefined"===typeof e?t:e}const Ds=(e,t)=>"string"===typeof e&&e.endsWith("%")?parseFloat(e)/100:+e/t,As=(e,t)=>"string"===typeof e&&e.endsWith("%")?parseFloat(e)/100*t:+e;function $s(e,t,s){if(e&&"function"===typeof e.call)return e.apply(s,t)}function Vs(e,t,s,i){let n,a,o;if(Ss(e))if(a=e.length,i)for(n=a-1;n>=0;n--)t.call(s,e[n],n);else for(n=0;ne,x:e=>e.x,y:e=>e.y};function zs(e){const t=e.split("."),s=[];let i="";for(const n of t)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(s.push(i),i="");return s}function Ns(e){const t=zs(e);return e=>{for(const s of t){if(""===s)break;e=e&&e[s]}return e}}function js(e,t){const s=Bs[t]||(Bs[t]=Ns(t));return s(e)}function Hs(e){return e.charAt(0).toUpperCase()+e.slice(1)}const qs=e=>"undefined"!==typeof e,Xs=e=>"function"===typeof e,Ks=(e,t)=>{if(e.size!==t.size)return!1;for(const s of e)if(!t.has(s))return!1;return!0};function Qs(e){return"mouseup"===e.type||"click"===e.type||"contextmenu"===e.type}const Ys=Math.PI,Gs=2*Ys,Js=Gs+Ys,Zs=Number.POSITIVE_INFINITY,ei=Ys/180,ti=Ys/2,si=Ys/4,ii=2*Ys/3,ni=Math.log10,ai=Math.sign;function oi(e,t,s){return Math.abs(e-t)e-t).pop(),t}function di(e){return"symbol"===typeof e||"object"===typeof e&&null!==e&&!(Symbol.toPrimitive in e||"toString"in e||"valueOf"in e)}function ci(e){return!di(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function hi(e,t){const s=Math.round(e);return s-t<=e&&s+t>=e}function ui(e,t,s){let i,n,a;for(i=0,n=e.length;ir&&d=Math.min(t,s)-i&&e<=Math.max(t,s)+i}function Ci(e,t,s){s=s||(s=>e[s]1)i=a+n>>1,s(i)?a=i:n=i;return{lo:a,hi:n}}const Si=(e,t,s,i)=>Ci(e,s,i?i=>{const n=e[i][t];return ne[i][t]Ci(e,s,i=>e[i][t]>=s);function Ti(e,t,s){let i=0,n=e.length;while(ii&&e[n-1]>s)n--;return i>0||n{const s="_onData"+Hs(t),i=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){const n=i.apply(this,t);return e._chartjs.listeners.forEach(e=>{"function"===typeof e[s]&&e[s](...t)}),n}})}))}function Di(e,t){const s=e._chartjs;if(!s)return;const i=s.listeners,n=i.indexOf(t);-1!==n&&i.splice(n,1),i.length>0||(Mi.forEach(t=>{delete e[t]}),delete e._chartjs)}function Ai(e){const t=new Set(e);return t.size===e.length?e:Array.from(t)}const $i=function(){return"undefined"===typeof window?function(e){return e()}:window.requestAnimationFrame}();function Vi(e,t){let s=[],i=!1;return function(...n){s=n,i||(i=!0,$i.call(window,()=>{i=!1,e.apply(t,s)}))}}function Li(e,t){let s;return function(...i){return t?(clearTimeout(s),s=setTimeout(e,t,i)):e.apply(this,i),t}}const Ei=e=>"start"===e?"left":"end"===e?"right":"center",Ui=(e,t,s)=>"start"===e?t:"end"===e?s:(t+s)/2,Ii=(e,t,s,i)=>{const n=i?"left":"right";return e===n?s:"center"===e?(t+s)/2:t};function Oi(e,t,s){const i=t.length;let n=0,a=i;if(e._sorted){const{iScale:o,vScale:l,_parsed:r}=e,d=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,c=o.axis,{min:h,max:u,minDefined:p,maxDefined:g}=o.getUserBounds();if(p){if(n=Math.min(Si(r,c,h).lo,s?i:Si(t,c,o.getPixelForValue(h)).lo),d){const e=r.slice(0,n+1).reverse().findIndex(e=>!Cs(e[l.axis]));n-=Math.max(0,e)}n=_i(n,0,i-1)}if(g){let e=Math.max(Si(r,o.axis,u,!0).hi+1,s?0:Si(t,c,o.getPixelForValue(u),!0).hi+1);if(d){const t=r.slice(e-1).findIndex(e=>!Cs(e[l.axis]));e+=Math.max(0,t)}a=_i(e,n,i)-n}else a=i-n}return{start:n,count:a}}function Ri(e){const{xScale:t,yScale:s,_scaleRanges:i}=e,n={xmin:t.min,xmax:t.max,ymin:s.min,ymax:s.max};if(!i)return e._scaleRanges=n,!0;const a=i.xmin!==t.min||i.xmax!==t.max||i.ymin!==s.min||i.ymax!==s.max;return Object.assign(i,n),a}const Wi=e=>0===e||1===e,Bi=(e,t,s)=>-Math.pow(2,10*(e-=1))*Math.sin((e-t)*Gs/s),zi=(e,t,s)=>Math.pow(2,-10*e)*Math.sin((e-t)*Gs/s)+1,Ni={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>1-Math.cos(e*ti),easeOutSine:e=>Math.sin(e*ti),easeInOutSine:e=>-.5*(Math.cos(Ys*e)-1),easeInExpo:e=>0===e?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>1===e?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>Wi(e)?e:e<.5?.5*Math.pow(2,10*(2*e-1)):.5*(2-Math.pow(2,-10*(2*e-1))),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Wi(e)?e:Bi(e,.075,.3),easeOutElastic:e=>Wi(e)?e:zi(e,.075,.3),easeInOutElastic(e){const t=.1125,s=.45;return Wi(e)?e:e<.5?.5*Bi(2*e,t,s):.5+.5*zi(2*e-1,t,s)},easeInBack(e){const t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){const t=1.70158;return(e-=1)*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?e*e*((1+(t*=1.525))*e-t)*.5:.5*((e-=2)*e*((1+(t*=1.525))*e+t)+2)},easeInBounce:e=>1-Ni.easeOutBounce(1-e),easeOutBounce(e){const t=7.5625,s=2.75;return e<1/s?t*e*e:e<2/s?t*(e-=1.5/s)*e+.75:e<2.5/s?t*(e-=2.25/s)*e+.9375:t*(e-=2.625/s)*e+.984375},easeInOutBounce:e=>e<.5?.5*Ni.easeInBounce(2*e):.5*Ni.easeOutBounce(2*e-1)+.5};function ji(e){if(e&&"object"===typeof e){const t=e.toString();return"[object CanvasPattern]"===t||"[object CanvasGradient]"===t}return!1}function Hi(e){return ji(e)?e:new _s(e)}function qi(e){return ji(e)?e:new _s(e).saturate(.5).darken(.1).hexString()}const Xi=["x","y","borderWidth","radius","tension"],Ki=["color","borderColor","backgroundColor"];function Qi(e){e.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:e=>"onProgress"!==e&&"onComplete"!==e&&"fn"!==e}),e.set("animations",{colors:{type:"color",properties:Ki},numbers:{type:"number",properties:Xi}}),e.describe("animations",{_fallback:"animation"}),e.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:e=>0|e}}}})}function Yi(e){e.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const Gi=new Map;function Ji(e,t){t=t||{};const s=e+JSON.stringify(t);let i=Gi.get(s);return i||(i=new Intl.NumberFormat(e,t),Gi.set(s,i)),i}function Zi(e,t,s){return Ji(t,s).format(e)}const en={values(e){return Ss(e)?e:""+e},numeric(e,t,s){if(0===e)return"0";const i=this.chart.options.locale;let n,a=e;if(s.length>1){const t=Math.max(Math.abs(s[0].value),Math.abs(s[s.length-1].value));(t<1e-4||t>1e15)&&(n="scientific"),a=tn(e,s)}const o=ni(Math.abs(a)),l=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),r={notation:n,minimumFractionDigits:l,maximumFractionDigits:l};return Object.assign(r,this.options.ticks.format),Zi(e,i,r)},logarithmic(e,t,s){if(0===e)return"0";const i=s[t].significand||e/Math.pow(10,Math.floor(ni(e)));return[1,2,3,5,10,15].includes(i)||t>.8*s.length?en.numeric.call(this,e,t,s):""}};function tn(e,t){let s=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(s)>=1&&e!==Math.floor(e)&&(s=e-Math.floor(e)),s}var sn={formatters:en};function nn(e){e.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:sn.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),e.route("scale.ticks","color","","color"),e.route("scale.grid","color","","borderColor"),e.route("scale.border","color","","borderColor"),e.route("scale.title","color","","color"),e.describe("scale",{_fallback:!1,_scriptable:e=>!e.startsWith("before")&&!e.startsWith("after")&&"callback"!==e&&"parser"!==e,_indexable:e=>"borderDash"!==e&&"tickBorderDash"!==e&&"dash"!==e}),e.describe("scales",{_fallback:"scale"}),e.describe("scale.ticks",{_scriptable:e=>"backdropPadding"!==e&&"callback"!==e,_indexable:e=>"backdropPadding"!==e})}const an=Object.create(null),on=Object.create(null);function ln(e,t){if(!t)return e;const s=t.split(".");for(let i=0,n=s.length;ie.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>qi(t.backgroundColor),this.hoverBorderColor=(e,t)=>qi(t.borderColor),this.hoverColor=(e,t)=>qi(t.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return rn(this,e,t)}get(e){return ln(this,e)}describe(e,t){return rn(on,e,t)}override(e,t){return rn(an,e,t)}route(e,t,s,i){const n=ln(this,e),a=ln(this,s),o="_"+t;Object.defineProperties(n,{[o]:{value:n[t],writable:!0},[t]:{enumerable:!0,get(){const e=this[o],t=a[i];return Fs(e)?Object.assign({},t,e):Ps(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}var cn=new dn({_scriptable:e=>!e.startsWith("on"),_indexable:e=>"events"!==e,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[Qi,Yi,nn]);function hn(e){return!e||Cs(e.size)||Cs(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}function un(e,t,s,i,n){let a=t[n];return a||(a=t[n]=e.measureText(n).width,s.push(n)),a>i&&(i=a),i}function pn(e,t,s,i){i=i||{};let n=i.data=i.data||{},a=i.garbageCollect=i.garbageCollect||[];i.font!==t&&(n=i.data={},a=i.garbageCollect=[],i.font=t),e.save(),e.font=t;let o=0;const l=s.length;let r,d,c,h,u;for(r=0;rs.length){for(r=0;r0&&e.stroke()}}function yn(e,t,s){return s=s||.5,!t||e&&e.x>t.left-s&&e.xt.top-s&&e.y0&&""!==a.strokeColor;let r,d;for(e.save(),e.font=n.string,wn(e,a),r=0;r+e||0;function $n(e,t){const s={},i=Fs(t),n=i?Object.keys(t):t,a=Fs(e)?i?s=>Ps(e[s],e[t[s]]):t=>e[t]:()=>e;for(const o of n)s[o]=An(a(o));return s}function Vn(e){return $n(e,{top:"y",right:"x",bottom:"y",left:"x"})}function Ln(e){return $n(e,["topLeft","topRight","bottomLeft","bottomRight"])}function En(e){const t=Vn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function Un(e,t){e=e||{},t=t||cn.font;let s=Ps(e.size,t.size);"string"===typeof s&&(s=parseInt(s,10));let i=Ps(e.style,t.style);i&&!(""+i).match(Pn)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);const n={family:Ps(e.family,t.family),lineHeight:Dn(Ps(e.lineHeight,t.lineHeight),s),size:s,style:i,weight:Ps(e.weight,t.weight),string:""};return n.string=hn(n),n}function In(e,t,s,i){let n,a,o,l=!0;for(n=0,a=e.length;ns&&0===e?0:e+t;return{min:o(i,-Math.abs(a)),max:o(n,a)}}function Rn(e,t){return Object.assign(Object.create(e),t)}function Wn(e,t=[""],s,i,n=()=>e[0]){const a=s||e;"undefined"===typeof i&&(i=sa("_fallback",e));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:i,_getTarget:n,override:s=>Wn([s,...e],t,a,i)};return new Proxy(o,{deleteProperty(t,s){return delete t[s],delete t._keys,delete e[0][s],!0},get(s,i){return Hn(s,i,()=>ta(i,t,e,s))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return ia(e).includes(t)},ownKeys(e){return ia(e)},set(e,t,s){const i=e._storage||(e._storage=n());return e[t]=i[t]=s,delete e._keys,!0}})}function Bn(e,t,s,i){const n={_cacheable:!1,_proxy:e,_context:t,_subProxy:s,_stack:new Set,_descriptors:zn(e,i),setContext:t=>Bn(e,t,s,i),override:n=>Bn(e.override(n),t,s,i)};return new Proxy(n,{deleteProperty(t,s){return delete t[s],delete e[s],!0},get(e,t,s){return Hn(e,t,()=>qn(e,t,s))},getOwnPropertyDescriptor(t,s){return t._descriptors.allKeys?Reflect.has(e,s)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,s)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,s){return Reflect.has(e,s)},ownKeys(){return Reflect.ownKeys(e)},set(t,s,i){return e[s]=i,delete t[s],!0}})}function zn(e,t={scriptable:!0,indexable:!0}){const{_scriptable:s=t.scriptable,_indexable:i=t.indexable,_allKeys:n=t.allKeys}=e;return{allKeys:n,scriptable:s,indexable:i,isScriptable:Xs(s)?s:()=>s,isIndexable:Xs(i)?i:()=>i}}const Nn=(e,t)=>e?e+Hs(t):t,jn=(e,t)=>Fs(t)&&"adapters"!==e&&(null===Object.getPrototypeOf(t)||t.constructor===Object);function Hn(e,t,s){if(Object.prototype.hasOwnProperty.call(e,t)||"constructor"===t)return e[t];const i=s();return e[t]=i,i}function qn(e,t,s){const{_proxy:i,_context:n,_subProxy:a,_descriptors:o}=e;let l=i[t];return Xs(l)&&o.isScriptable(t)&&(l=Xn(t,l,e,s)),Ss(l)&&l.length&&(l=Kn(t,l,e,o.isIndexable)),jn(t,l)&&(l=Bn(l,n,a&&a[t],o)),l}function Xn(e,t,s,i){const{_proxy:n,_context:a,_subProxy:o,_stack:l}=s;if(l.has(e))throw new Error("Recursion detected: "+Array.from(l).join("->")+"->"+e);l.add(e);let r=t(a,o||i);return l.delete(e),jn(e,r)&&(r=Jn(n._scopes,n,e,r)),r}function Kn(e,t,s,i){const{_proxy:n,_context:a,_subProxy:o,_descriptors:l}=s;if("undefined"!==typeof a.index&&i(e))return t[a.index%t.length];if(Fs(t[0])){const s=t,i=n._scopes.filter(e=>e!==s);t=[];for(const r of s){const s=Jn(i,n,e,r);t.push(Bn(s,a,o&&o[e],l))}}return t}function Qn(e,t,s){return Xs(e)?e(t,s):e}const Yn=(e,t)=>!0===e?t:"string"===typeof e?js(t,e):void 0;function Gn(e,t,s,i,n){for(const a of t){const t=Yn(s,a);if(t){e.add(t);const a=Qn(t._fallback,s,n);if("undefined"!==typeof a&&a!==s&&a!==i)return a}else if(!1===t&&"undefined"!==typeof i&&s!==i)return null}return!1}function Jn(e,t,s,i){const n=t._rootScopes,a=Qn(t._fallback,s,i),o=[...e,...n],l=new Set;l.add(i);let r=Zn(l,o,s,a||s,i);return null!==r&&(("undefined"===typeof a||a===s||(r=Zn(l,o,a,r,i),null!==r))&&Wn(Array.from(l),[""],n,a,()=>ea(t,s,i)))}function Zn(e,t,s,i,n){while(s)s=Gn(e,t,s,i,n);return s}function ea(e,t,s){const i=e._getTarget();t in i||(i[t]={});const n=i[t];return Ss(n)&&Fs(s)?s:n||{}}function ta(e,t,s,i){let n;for(const a of t)if(n=sa(Nn(a,e),s),"undefined"!==typeof n)return jn(e,n)?Jn(s,i,e,n):n}function sa(e,t){for(const s of t){if(!s)continue;const t=s[e];if("undefined"!==typeof t)return t}}function ia(e){let t=e._keys;return t||(t=e._keys=na(e._scopes)),t}function na(e){const t=new Set;for(const s of e)for(const e of Object.keys(s).filter(e=>!e.startsWith("_")))t.add(e);return Array.from(t)}function aa(e,t,s,i){const{iScale:n}=e,{key:a="r"}=this._parsing,o=new Array(i);let l,r,d,c;for(l=0,r=i;lt"x"===e?"y":"x";function da(e,t,s,i){const n=e.skip?t:e,a=t,o=s.skip?t:s,l=bi(a,n),r=bi(o,a);let d=l/(l+r),c=r/(l+r);d=isNaN(d)?0:d,c=isNaN(c)?0:c;const h=i*d,u=i*c;return{previous:{x:a.x-h*(o.x-n.x),y:a.y-h*(o.y-n.y)},next:{x:a.x+u*(o.x-n.x),y:a.y+u*(o.y-n.y)}}}function ca(e,t,s){const i=e.length;let n,a,o,l,r,d=la(e,0);for(let c=0;c!e.skip)),"monotone"===t.cubicInterpolationMode)ua(e,n);else{let s=i?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function va(e,t){return xa(e).getPropertyValue(t)}const _a=["top","right","bottom","left"];function ka(e,t,s){const i={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=_a[n];i[a]=parseFloat(e[t+"-"+a+s])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}const wa=(e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot);function Ca(e,t){const s=e.touches,i=s&&s.length?s[0]:e,{offsetX:n,offsetY:a}=i;let o,l,r=!1;if(wa(n,a,e.target))o=n,l=a;else{const e=t.getBoundingClientRect();o=i.clientX-e.left,l=i.clientY-e.top,r=!0}return{x:o,y:l,box:r}}function Sa(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:i}=t,n=xa(s),a="border-box"===n.boxSizing,o=ka(n,"padding"),l=ka(n,"border","width"),{x:r,y:d,box:c}=Ca(e,s),h=o.left+(c&&l.left),u=o.top+(c&&l.top);let{width:p,height:g}=t;return a&&(p-=o.width+l.width,g-=o.height+l.height),{x:Math.round((r-h)/p*s.width/i),y:Math.round((d-u)/g*s.height/i)}}function Fa(e,t,s){let i,n;if(void 0===t||void 0===s){const a=e&&ba(e);if(a){const e=a.getBoundingClientRect(),o=xa(a),l=ka(o,"border","width"),r=ka(o,"padding");t=e.width-r.width-l.width,s=e.height-r.height-l.height,i=ya(o.maxWidth,a,"clientWidth"),n=ya(o.maxHeight,a,"clientHeight")}else t=e.clientWidth,s=e.clientHeight}return{width:t,height:s,maxWidth:i||Zs,maxHeight:n||Zs}}const Ta=e=>Math.round(10*e)/10;function Ma(e,t,s,i){const n=xa(e),a=ka(n,"margin"),o=ya(n.maxWidth,e,"clientWidth")||Zs,l=ya(n.maxHeight,e,"clientHeight")||Zs,r=Fa(e,t,s);let{width:d,height:c}=r;if("content-box"===n.boxSizing){const e=ka(n,"border","width"),t=ka(n,"padding");d-=t.width+e.width,c-=t.height+e.height}d=Math.max(0,d-a.width),c=Math.max(0,i?d/i:c-a.height),d=Ta(Math.min(d,o,r.maxWidth)),c=Ta(Math.min(c,l,r.maxHeight)),d&&!c&&(c=Ta(d/2));const h=void 0!==t||void 0!==s;return h&&i&&r.height&&c>r.height&&(c=r.height,d=Ta(Math.floor(c*i))),{width:d,height:c}}function Pa(e,t,s){const i=t||1,n=Ta(e.height*i),a=Ta(e.width*i);e.height=Ta(e.height),e.width=Ta(e.width);const o=e.canvas;return o.style&&(s||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),(e.currentDevicePixelRatio!==i||o.height!==n||o.width!==a)&&(e.currentDevicePixelRatio=i,o.height=n,o.width=a,e.ctx.setTransform(i,0,0,i,0,0),!0)}const Da=function(){let e=!1;try{const t={get passive(){return e=!0,!1}};ma()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch(t){}return e}();function Aa(e,t){const s=va(e,t),i=s&&s.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function $a(e,t,s,i){return{x:e.x+s*(t.x-e.x),y:e.y+s*(t.y-e.y)}}function Va(e,t,s,i){return{x:e.x+s*(t.x-e.x),y:"middle"===i?s<.5?e.y:t.y:"after"===i?s<1?e.y:t.y:s>0?t.y:e.y}}function La(e,t,s,i){const n={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=$a(e,n,s),l=$a(n,a,s),r=$a(a,t,s),d=$a(o,l,s),c=$a(l,r,s);return $a(d,c,s)}const Ea=function(e,t){return{x(s){return e+e+t-s},setWidth(e){t=e},textAlign(e){return"center"===e?e:"right"===e?"left":"right"},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},Ua=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function Ia(e,t,s){return e?Ea(t,s):Ua()}function Oa(e,t){let s,i;"ltr"!==t&&"rtl"!==t||(s=e.canvas.style,i=[s.getPropertyValue("direction"),s.getPropertyPriority("direction")],s.setProperty("direction",t,"important"),e.prevTextDirection=i)}function Ra(e,t){void 0!==t&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}function Wa(e){return"angle"===e?{between:vi,compare:yi,normalize:xi}:{between:wi,compare:(e,t)=>e-t,normalize:e=>e}}function Ba({start:e,end:t,count:s,loop:i,style:n}){return{start:e%s,end:t%s,loop:i&&(t-e+1)%s===0,style:n}}function za(e,t,s){const{property:i,start:n,end:a}=s,{between:o,normalize:l}=Wa(i),r=t.length;let d,c,{start:h,end:u,loop:p}=e;if(p){for(h+=r,u+=r,d=0,c=r;dr(n,b,f)&&0!==l(n,b),_=()=>0===l(a,f)||r(a,b,f),k=()=>y||v(),w=()=>!y||_();for(let C=c,S=c;C<=h;++C)m=t[C%o],m.skip||(f=d(m[i]),f!==b&&(y=r(f,n,a),null===x&&k()&&(x=0===l(f,n)?C:S),null!==x&&w()&&(g.push(Ba({start:x,end:C,loop:u,count:o,style:p})),x=null),S=C,b=f));return null!==x&&g.push(Ba({start:x,end:h,loop:u,count:o,style:p})),g}function ja(e,t){const s=[],i=e.segments;for(let n=0;nn&&e[a%t].skip)a--;return a%=t,{start:n,end:a}}function qa(e,t,s,i){const n=e.length,a=[];let o,l=t,r=e[t];for(o=t+1;o<=s;++o){const s=e[o%n];s.skip||s.stop?r.skip||(i=!1,a.push({start:t%n,end:(o-1)%n,loop:i}),t=l=s.stop?o:null):(l=o,r.skip&&(t=o)),r=s}return null!==l&&a.push({start:t%n,end:l%n,loop:i}),a}function Xa(e,t){const s=e.points,i=e.options.spanGaps,n=s.length;if(!n)return[];const a=!!e._loop,{start:o,end:l}=Ha(s,n,a,i);if(!0===i)return Ka(e,[{start:o,end:l,loop:a}],s,t);const r=li({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(s-t.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(e),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,e,"progress")),n.length||(s.running=!1,this._notify(i,s,e,"complete"),s.initial=!1),t+=n.length}),this._lastDate=e,0===t&&(this._running=!1)}_getAnims(e){const t=this._charts;let s=t.get(e);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,s)),s}listen(e,t,s){this._getAnims(e).listeners[t].push(s)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){const t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;const t=this._charts.get(e);return!!(t&&t.running&&t.items.length)}stop(e){const t=this._charts.get(e);if(!t||!t.items.length)return;const s=t.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();t.items=[],this._notify(e,t,Date.now(),"complete")}remove(e){return this._charts.delete(e)}}var so=new to;const io="transparent",no={boolean(e,t,s){return s>.5?t:e},color(e,t,s){const i=Hi(e||io),n=i.valid&&Hi(t||io);return n&&n.valid?n.mix(i,s).hexString():t},number(e,t,s){return e+(t-e)*s}};class ao{constructor(e,t,s,i){const n=t[s];i=In([e.to,i,n,e.from]);const a=In([e.from,n,i]);this._active=!0,this._fn=e.fn||no[e.type||typeof a],this._easing=Ni[e.easing]||Ni.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(e,t,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=n,this._loop=!!e.loop,this._to=In([e.to,t,i,e.from]),this._from=In([e.from,i,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){const t=e-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||t1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const e=this._promises||(this._promises=[]);return new Promise((t,s)=>{e.push({res:t,rej:s})})}_notify(e){const t=e?"res":"rej",s=this._promises||[];for(let i=0;i{const n=e[i];if(!Fs(n))return;const a={};for(const e of t)a[e]=n[e];(Ss(n.properties)&&n.properties||[i]).forEach(e=>{e!==i&&s.has(e)||s.set(e,a)})})}_animateOptions(e,t){const s=t.options,i=ro(e,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&lo(e.options.$animations,s).then(()=>{e.options=s},()=>{}),n}_createAnimations(e,t){const s=this._properties,i=[],n=e.$animations||(e.$animations={}),a=Object.keys(t),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(e,t));continue}const d=t[r];let c=n[r];const h=s.get(r);if(c){if(h&&c.active()){c.update(h,d,o);continue}c.cancel()}h&&h.duration?(n[r]=c=new ao(h,e,r,d),i.push(c)):e[r]=d}return i}update(e,t){if(0===this._properties.size)return void Object.assign(e,t);const s=this._createAnimations(e,t);return s.length?(so.add(this._chart,s),!0):void 0}}function lo(e,t){const s=[],i=Object.keys(t);for(let n=0;n0||!s&&t<0)return n.index}return null}function _o(e,t){const{chart:s,_cachedMeta:i}=e,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,d=o.axis,c=bo(a,o,i),h=t.length;let u;for(let p=0;ps[e].axis===t).shift()}function wo(e,t){return Rn(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function Co(e,t,s){return Rn(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:s,index:t,mode:"default",type:"data"})}function So(e,t){const s=e.controller.index,i=e.vScale&&e.vScale.axis;if(i){t=t||e._parsed;for(const e of t){const t=e._stacks;if(!t||void 0===t[i]||void 0===t[i][s])return;delete t[i][s],void 0!==t[i]._visualValues&&void 0!==t[i]._visualValues[s]&&delete t[i]._visualValues[s]}}}const Fo=e=>"reset"===e||"none"===e,To=(e,t)=>t?e:Object.assign({},e),Mo=(e,t,s)=>e&&!t.hidden&&t._stacked&&{keys:po(s,!0),values:null};class Po{constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=mo(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(e){this.index!==e&&So(this._cachedMeta),this.index=e}linkScales(){const e=this.chart,t=this._cachedMeta,s=this.getDataset(),i=(e,t,s,i)=>"x"===e?t:"r"===e?i:s,n=t.xAxisID=Ps(s.xAxisID,ko(e,"x")),a=t.yAxisID=Ps(s.yAxisID,ko(e,"y")),o=t.rAxisID=Ps(s.rAxisID,ko(e,"r")),l=t.indexAxis,r=t.iAxisID=i(l,n,a,o),d=t.vAxisID=i(l,a,n,o);t.xScale=this.getScaleForId(n),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(r),t.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){const t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update("reset")}_destroy(){const e=this._cachedMeta;this._data&&Di(this._data,this),e._stacked&&So(e)}_dataCheck(){const e=this.getDataset(),t=e.data||(e.data=[]),s=this._data;if(Fs(t)){const e=this._cachedMeta;this._data=fo(t,e)}else if(s!==t){if(s){Di(s,this);const e=this._cachedMeta;So(e),e._parsed=[]}t&&Object.isExtensible(t)&&Pi(t,this),this._syncList=[],this._data=t}}addElements(){const e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){const t=this._cachedMeta,s=this.getDataset();let i=!1;this._dataCheck();const n=t._stacked;t._stacked=mo(t.vScale,t),t.stack!==s.stack&&(i=!0,So(t),t.stack=s.stack),this._resyncElements(e),(i||n!==t._stacked)&&(_o(this,t._parsed),t._stacked=mo(t.vScale,t))}configure(){const e=this.chart.config,t=e.datasetScopeKeys(this._type),s=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,d,c=0===e&&t===i.length||s._sorted,h=e>0&&s._parsed[e-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[e])?this.parseArrayData(s,i,e,t):Fs(i[e])?this.parseObjectData(s,i,e,t):this.parsePrimitiveData(s,i,e,t);const n=()=>null===r[o]||h&&r[o]t||c=0;--h)if(!p()){this.updateRangeFromParsed(r,e,u,l);break}return r}getAllParsedValues(e){const t=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=t.length;i=0&&ethis.getContext(s,i,t),g=r.resolveNamedOptions(h,u,p,c);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(To(g,l))),g}_resolveAnimations(e,t,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${t}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,t),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(e,s,t))}const r=new oo(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||Fo(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){const s=this.resolveDataElementOptions(e,t),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(t,n)||n!==i;return this.updateSharedOptions(n,t,s),{sharedOptions:n,includeOptions:a}}updateElement(e,t,s,i){Fo(i)?Object.assign(e,s):this._resolveAnimations(t,i).update(e,s)}updateSharedOptions(e,t,s){e&&!Fo(t)&&this._resolveAnimations(void 0,t).update(e,s)}_setStyle(e,t,s,i){e.active=i;const n=this.getStyle(t,i);this._resolveAnimations(t,s,i).update(e,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(e,t,s){this._setStyle(e,s,"active",!1)}setHoverStyle(e,t,s){this._setStyle(e,s,"active",!0)}_removeDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!1)}_setDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!0)}_resyncElements(e){const t=this._data,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=t.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,e):n{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(l(n),o=e;oe-t))}return e._cache.$bar}function Ao(e){const t=e.iScale,s=Do(t,e.type);let i,n,a,o,l=t._length;const r=()=>{32767!==a&&-32768!==a&&(qs(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[e-1]:null,l=eMath.abs(l)&&(r=l,d=o),t[s.axis]=d,t._custom={barStart:r,barEnd:d,start:n,end:a,min:o,max:l}}function Eo(e,t,s,i){return Ss(e)?Lo(e,t,s,i):t[s.axis]=s.parse(e,i),t}function Uo(e,t,s,i){const n=e.iScale,a=e.vScale,o=n.getLabels(),l=n===a,r=[];let d,c,h,u;for(d=s,c=s+i;d=s?1:-1)}function Ro(e){let t,s,i,n,a;return e.horizontal?(t=e.base>e.x,s="left",i="right"):(t=e.basee.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),l=o&&o[s.axis],r=e=>{const t=e._parsed.find(e=>e[s.axis]===l),i=t&&t[e.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===t||!r(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(s=>e[s].axis===t).shift()}_getAxis(){const e={},t=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)e[Ps("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,s){const i=this._getStacks(e,s),n=void 0!==t?i.indexOf(t):-1;return-1===n?i.length-1:n}_getRuler(){const e=this.options,t=this._cachedMeta,s=t.iScale,i=[];let n,a;for(n=0,a=t.data.length;n=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}getLabelAndValue(e){const t=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=t,a=this.getParsed(e),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[e]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(e){const t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(t,i),d=a.axis,c=o.axis;for(let h=t;hvi(e,l,r,!0)?1:Math.max(t,t*s,i,i*s),g=(e,t,i)=>vi(e,l,r,!0)?-1:Math.min(t,t*s,i,i*s),f=p(0,d,h),m=p(ti,c,u),b=g(Ys,d,h),y=g(Ys+ti,c,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,Dt.A)(qo,"id","bubble"),(0,Dt.A)(qo,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,Dt.A)(qo,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Po{constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){const s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=e=>+s[e];if(Fs(s[e])){const{key:e="value"}=this._parsing;o=t=>+js(s[t],e)}for(n=e,a=e+t;n0&&!isNaN(e)?Gs*(Math.abs(e)/t):0}getLabelAndValue(e){const t=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(t._parsed[e],s.options.locale);return{label:i[e]||"",value:n}}getMaxBorderWidth(e){let t=0;const s=this.chart;let i,n,a,o,l;if(!e)for(i=0,n=s.data.datasets.length;i"spacing"!==e,_indexable:e=>"spacing"!==e&&!e.startsWith("borderDash")&&!e.startsWith("hoverBorderDash")}),(0,Dt.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){const t=e.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,l)=>{const r=e.getDatasetMeta(0),d=r.controller.getStyle(l);return{text:t,fillStyle:d.backgroundColor,fontColor:n,hidden:!e.getDataVisibility(l),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:l}}):[]}},onClick(e,t,s){s.chart.toggleDataVisibility(t.index),s.chart.update()}}}});class Qo extends Po{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(e){const t=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=t,a=this.chart._animationsDisabled;let{start:o,count:l}=Oi(t,i,a);this._drawStart=o,this._drawCount=l,Ri(t)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(e);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},e),this.updateElements(i,o,l,e)}updateElements(e,t,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:d,includeOptions:c}=this._getSharedOptions(t,i),h=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=ci(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=t+s,y=e.length;let x=t>0&&this.getParsed(t-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[h]=a.getPixelForValue(y[h],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[h]-x[h])>f,g&&(p.parsed=y,p.raw=r.data[v]),c&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const e=this._cachedMeta,t=e.dataset,s=t.options&&t.options.borderWidth||0,i=e.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}}(0,Dt.A)(Qo,"id","line"),(0,Dt.A)(Qo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,Dt.A)(Qo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Yo extends Po{constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){const t=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(t._parsed[e].r,s.options.locale);return{label:i[e]||"",value:n}}parseObjectData(e,t,s,i){return aa.bind(this)(e,t,s,i)}update(e){const t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){const e=this._cachedMeta,t={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach((e,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(it.max&&(t.max=i))}),t}_updateRadius(){const e=this.chart,t=e.chartArea,s=e.options,i=Math.min(t.right-t.left,t.bottom-t.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/e.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(e,t,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,d=r.xCenter,c=r.yCenter,h=r.getIndexAngle(0)-.5*Ys;let u,p=h;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&t++}),t}_computeAngle(e,t,s){return this.chart.getDataVisibility(e)?pi(this.resolveDataElementOptions(e,t).angle||s):0}}(0,Dt.A)(Yo,"id","polarArea"),(0,Dt.A)(Yo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,Dt.A)(Yo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){const t=e.data;if(t.labels.length&&t.datasets.length){const{labels:{pointStyle:s,color:i}}=e.legend.options;return t.labels.map((t,n)=>{const a=e.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:t,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!e.getDataVisibility(n),index:n}})}return[]}},onClick(e,t,s){s.chart.toggleDataVisibility(t.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,Dt.A)(Go,"id","pie"),(0,Dt.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Po{getLabelAndValue(e){const t=this._cachedMeta.vScale,s=this.getParsed(e);return{label:t.getLabels()[e],value:""+t.getLabelForValue(s[t.axis])}}parseObjectData(e,t,s,i){return aa.bind(this)(e,t,s,i)}update(e){const t=this._cachedMeta,s=t.dataset,i=t.data||[],n=t.iScale.getLabels();if(s.points=i,"resize"!==e){const t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:t};this.updateElement(s,void 0,a,e)}this.updateElements(i,0,i.length,e)}updateElements(e,t,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=t;o0&&this.getParsed(t-1);for(let x=t;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=r.data[x]),h&&(d.options=c||this.resolveDataElementOptions(x,t.active?"active":i)),b||this.updateElement(t,x,d,i),y=s}this.updateSharedOptions(c,i,d)}getMaxOverflow(){const e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let s=t.length-1;s>=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}const s=e.dataset,i=s.options&&s.options.borderWidth||0;if(!t.length)return i;const n=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(i,n,a)/2}}(0,Dt.A)(Zo,"id","scatter"),(0,Dt.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,Dt.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function el(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class tl{static override(e){Object.assign(tl.prototype,e)}constructor(e){(0,Dt.A)(this,"options",void 0),this.options=e||{}}init(){}formats(){return el()}parse(){return el()}format(){return el()}add(){return el()}diff(){return el()}startOf(){return el()}endOf(){return el()}}var sl={_date:tl};function il(e,t,s,i){const{controller:n,data:a,_sorted:o}=e,l=n._cachedMeta.iScale,r=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(l&&t===l.axis&&"r"!==t&&o&&a.length){const o=l._reversePixels?Fi:Si;if(!i){const i=o(a,t,s);if(r){const{vScale:t}=n._cachedMeta,{_parsed:s}=e,a=s.slice(0,i.lo+1).reverse().findIndex(e=>!Cs(e[t.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(e=>!Cs(e[t.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const e=a[0],i="function"===typeof e.getRange&&e.getRange(t);if(i){const e=o(a,t,s-i),n=o(a,t,s+i);return{lo:e.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nl(e,t,s,i,n){const a=e.getSortedVisibleDatasetMetas(),o=s[t];for(let l=0,r=a.length;l{e[o]&&e[o](t[s],n)&&(a.push({element:e,datasetIndex:i,index:r}),l=l||e.inRange(t.x,t.y,n))}),i&&!l?[]:a}var hl={evaluateInteractionItems:nl,modes:{index(e,t,s,i){const n=Sa(t,e),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?ol(e,n,a,i,o):dl(e,n,a,!1,i,o),r=[];return l.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{const t=l[0].index,s=e.data[t];s&&!s.skip&&r.push({element:s,datasetIndex:e.index,index:t})}),r):[]},dataset(e,t,s,i){const n=Sa(t,e),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?ol(e,n,a,i,o):dl(e,n,a,!1,i,o);if(l.length>0){const t=l[0].datasetIndex,s=e.getDatasetMeta(t).data;l=[];for(let e=0;ee.pos===t)}function gl(e,t){return e.filter(e=>-1===ul.indexOf(e.pos)&&e.box.axis===t)}function fl(e,t){return e.sort((e,s)=>{const i=t?s:e,n=t?e:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function ml(e){const t=[];let s,i,n,a,o,l;for(s=0,i=(e||[]).length;se.box.fullSize),!0),i=fl(pl(t,"left"),!0),n=fl(pl(t,"right")),a=fl(pl(t,"top"),!0),o=fl(pl(t,"bottom")),l=gl(t,"x"),r=gl(t,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:pl(t,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function vl(e,t,s,i){return Math.max(e[s],t[s])+Math.max(e[i],t[i])}function _l(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function kl(e,t,s,i){const{pos:n,box:a}=s,o=e.maxPadding;if(!Fs(n)){s.size&&(e[n]-=s.size);const t=i[s.stack]||{size:0,count:1};t.size=Math.max(t.size,s.horizontal?a.height:a.width),s.size=t.size/t.count,e[n]+=s.size}a.getPadding&&_l(o,a.getPadding());const l=Math.max(0,t.outerWidth-vl(o,e,"left","right")),r=Math.max(0,t.outerHeight-vl(o,e,"top","bottom")),d=l!==e.w,c=r!==e.h;return e.w=l,e.h=r,s.horizontal?{same:d,other:c}:{same:c,other:d}}function wl(e){const t=e.maxPadding;function s(s){const i=Math.max(t[s]-e[s],0);return e[s]+=i,i}e.y+=s("top"),e.x+=s("left"),s("right"),s("bottom")}function Cl(e,t){const s=t.maxPadding;function i(e){const i={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{i[e]=Math.max(t[e],s[e])}),i}return i(e?["left","right"]:["top","bottom"])}function Sl(e,t,s,i){const n=[];let a,o,l,r,d,c;for(a=0,o=e.length,d=0;a{"function"===typeof e.beforeLayout&&e.beforeLayout()});const c=r.reduce((e,t)=>t.box.options&&!1===t.box.options.display?e:e+1,0)||1,h=Object.freeze({outerWidth:t,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);_l(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yl(r.concat(d),h);Sl(l.fullSize,p,h,g),Sl(r,p,h,g),Sl(d,p,h,g)&&Sl(r,p,h,g),wl(p),Tl(l.leftAndTop,p,h,g),p.x+=p.w,p.y+=p.h,Tl(l.rightAndBottom,p,h,g),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Vs(l.chartArea,t=>{const s=t.box;Object.assign(s,e.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Pl{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,s){}removeEventListener(e,t,s){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,s,i){return t=Math.max(0,t||e.width),s=s||e.height,{width:t,height:Math.max(0,i?Math.floor(t/i):s)}}isAttached(e){return!0}updateConfig(e){}}class Dl extends Pl{acquireContext(e){return e&&e.getContext&&e.getContext("2d")||null}updateConfig(e){e.options.animation=!1}}const Al="$chartjs",$l={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Vl=e=>null===e||""===e;function Ll(e,t){const s=e.style,i=e.getAttribute("height"),n=e.getAttribute("width");if(e[Al]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Vl(n)){const t=Aa(e,"width");void 0!==t&&(e.width=t)}if(Vl(i))if(""===e.style.height)e.height=e.width/(t||2);else{const t=Aa(e,"height");void 0!==t&&(e.height=t)}return e}const El=!!Da&&{passive:!0};function Ul(e,t,s){e&&e.addEventListener(t,s,El)}function Il(e,t,s){e&&e.canvas&&e.canvas.removeEventListener(t,s,El)}function Ol(e,t){const s=$l[e.type]||e.type,{x:i,y:n}=Sa(e,t);return{type:s,chart:t,native:e,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rl(e,t){for(const s of e)if(s===t||s.contains(t))return!0}function Wl(e,t,s){const i=e.canvas,n=new MutationObserver(e=>{let t=!1;for(const s of e)t=t||Rl(s.addedNodes,i),t=t&&!Rl(s.removedNodes,i);t&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Bl(e,t,s){const i=e.canvas,n=new MutationObserver(e=>{let t=!1;for(const s of e)t=t||Rl(s.removedNodes,i),t=t&&!Rl(s.addedNodes,i);t&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const zl=new Map;let Nl=0;function jl(){const e=window.devicePixelRatio;e!==Nl&&(Nl=e,zl.forEach((t,s)=>{s.currentDevicePixelRatio!==e&&t()}))}function Hl(e,t){zl.size||window.addEventListener("resize",jl),zl.set(e,t)}function ql(e){zl.delete(e),zl.size||window.removeEventListener("resize",jl)}function Xl(e,t,s){const i=e.canvas,n=i&&ba(i);if(!n)return;const a=Vi((e,t)=>{const i=n.clientWidth;s(e,t),i{const t=e[0],s=t.contentRect.width,i=t.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),Hl(e,a),o}function Kl(e,t,s){s&&s.disconnect(),"resize"===t&&ql(e)}function Ql(e,t,s){const i=e.canvas,n=Vi(t=>{null!==e.ctx&&s(Ol(t,e))},e);return Ul(i,t,n),n}class Yl extends Pl{acquireContext(e,t){const s=e&&e.getContext&&e.getContext("2d");return s&&s.canvas===e?(Ll(e,t),s):null}releaseContext(e){const t=e.canvas;if(!t[Al])return!1;const s=t[Al].initial;["height","width"].forEach(e=>{const i=s[e];Cs(i)?t.removeAttribute(e):t.setAttribute(e,i)});const i=s.style||{};return Object.keys(i).forEach(e=>{t.style[e]=i[e]}),t.width=t.width,delete t[Al],!0}addEventListener(e,t,s){this.removeEventListener(e,t);const i=e.$proxies||(e.$proxies={}),n={attach:Wl,detach:Bl,resize:Xl},a=n[t]||Ql;i[t]=a(e,t,s)}removeEventListener(e,t){const s=e.$proxies||(e.$proxies={}),i=s[t];if(!i)return;const n={attach:Kl,detach:Kl,resize:Kl},a=n[t]||Il;a(e,t,i),s[t]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,s,i){return Ma(e,t,s,i)}isAttached(e){const t=e&&ba(e);return!(!t||!t.isConnected)}}function Gl(e){return!ma()||"undefined"!==typeof OffscreenCanvas&&e instanceof OffscreenCanvas?Dl:Yl}class Jl{constructor(){(0,Dt.A)(this,"x",void 0),(0,Dt.A)(this,"y",void 0),(0,Dt.A)(this,"active",!1),(0,Dt.A)(this,"options",void 0),(0,Dt.A)(this,"$animations",void 0)}tooltipPosition(e){const{x:t,y:s}=this.getProps(["x","y"],e);return{x:t,y:s}}hasValue(){return ci(this.x)&&ci(this.y)}getProps(e,t){const s=this.$animations;if(!t||!s)return this;const i={};return e.forEach(e=>{i[e]=s[e]&&s[e].active()?s[e]._to:this[e]}),i}}function Zl(e,t){const s=e.options.ticks,i=er(e),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sr(t):[],o=a.length,l=a[0],r=a[o-1],d=[];if(o>n)return ir(t,d,a,o/n),d;const c=tr(a,t,n);if(o>0){let e,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(nr(t,d,c,Cs(i)?0:l-i,l),e=0,s=o-1;en)return e}return Math.max(n,1)}function sr(e){const t=[];let s,i;for(s=0,i=e.length;s"left"===e?"right":"right"===e?"left":e,lr=(e,t,s)=>"top"===t||"left"===t?e[t]+s:e[t]-s,rr=(e,t)=>Math.min(t||e,e);function dr(e,t){const s=[],i=e.length/t,n=e.length;let a=0;for(;ao+l)))return d}function hr(e,t){Vs(e,e=>{const s=e.gc,i=s.length/2;let n;if(i>t){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ms(s,Ms(i,s)),max:Ms(i,Ms(s,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){const t=this._labelItems||(this._labelItems=this._computeLabelItems(e));return t}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){$s(this.options.beforeUpdate,[this])}update(e,t,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),c=d.widest.width,h=d.highest.height,u=_i(this.chart.width-c,0,this.maxWidth);a=e.offset?this.maxWidth/s:u/(s-1),c+6>a&&(a=u/(s-(e.offset?.5:1)),o=this.maxHeight-ur(e.grid)-t.padding-pr(e.title,this.chart.options.font),l=Math.sqrt(c*c+h*h),r=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/l,-1,1))-Math.asin(_i(h/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const e={width:0,height:0},{chart:t,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pr(i,t.options.font);if(o?(e.width=this.maxWidth,e.height=ur(n)+a):(e.height=this.maxHeight,e.width=ur(n)+a),s.display&&this.ticks.length){const{first:t,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=pi(this.labelRotation),d=Math.cos(r),c=Math.sin(r);if(o){const t=s.mirror?0:c*n.width+d*a.height;e.height=Math.min(this.maxHeight,e.height+t+l)}else{const t=s.mirror?0:d*n.width+c*a.height;e.width=Math.min(this.maxWidth,e.width+t+l)}this._calculatePadding(t,i,c,d)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,h=0;l?r?(c=i*e.width,h=s*t.height):(c=s*e.height,h=i*t.width):"start"===n?h=t.width:"end"===n?c=e.width:"inner"!==n&&(c=e.width/2,h=t.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((h-d+a)*this.width/(this.width-d),0)}else{let s=t.height/2,i=e.height/2;"start"===n?(s=0,i=e.height):"end"===n&&(s=t.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){$s(this.options.afterFit,[this])}isHorizontal(){const{axis:e,position:t}=this.options;return"top"===t||"bottom"===t||"x"===e}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){let t,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(e),t=0,s=e.length;t({width:a[e]||0,height:o[e]||0});return{first:w(0),last:w(t-1),widest:w(_),highest:w(k),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);const t=this._startPixel+e*this._length;return ki(this._alignToPixels?gn(this.chart,t,0):t)}getDecimalForPixel(e){const t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){const t=this.ticks||[];if(e>=0&&eo*i?o/s:l/i:l*i0}_computeGridLineItems(e){const t=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),d=this.ticks,c=d.length+(l?1:0),h=ur(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(e){return gn(s,e,g)};let b,y,x,v,_,k,w,C,S,F,T,M;if("top"===a)b=m(this.bottom),k=this.bottom-h,C=b-f,F=m(e.top)+f,M=e.bottom;else if("bottom"===a)b=m(this.top),F=e.top,M=m(e.bottom)-f,k=b+f,C=this.top+h;else if("left"===a)b=m(this.right),_=this.right-h,w=b-f,S=m(e.left)+f,T=e.right;else if("right"===a)b=m(this.left),S=e.left,T=m(e.right)-f,_=b+f,w=this.left+h;else if("x"===t){if("center"===a)b=m((e.top+e.bottom)/2+.5);else if(Fs(a)){const e=Object.keys(a)[0],t=a[e];b=m(this.chart.scales[e].getPixelForValue(t))}F=e.top,M=e.bottom,k=b+f,C=k+h}else if("y"===t){if("center"===a)b=m((e.left+e.right)/2);else if(Fs(a)){const e=Object.keys(a)[0],t=a[e];b=m(this.chart.scales[e].getPixelForValue(t))}_=b-f,w=_-h,S=e.left,T=e.right}const P=Ps(i.ticks.maxTicksLimit,c),D=Math.max(1,Math.ceil(c/P));for(y=0;y0&&(a-=i/2);break}h={left:a,top:n,width:i+t.width,height:s+t.height,color:e.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:d,textAlign:u,textBaseline:M,translation:[v,_],backdrop:h}})}return f}_getXAxisLabelAlignment(){const{position:e,ticks:t}=this.options,s=-pi(this.labelRotation);if(s)return"top"===e?"left":"right";let i="center";return"start"===t.align?i="left":"end"===t.align?i="right":"inner"===t.align&&(i="inner"),i}_getYAxisLabelAlignment(e){const{position:t,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=e+n,l=a.widest.width;let r,d;return"left"===t?i?(d=this.right+n,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d+=l)):(d=this.right-o,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d=this.left)):"right"===t?i?(d=this.left+n,"near"===s?r="right":"center"===s?(r="center",d-=l/2):(r="left",d-=l)):(d=this.left+o,"near"===s?r="left":"center"===s?(r="center",d+=l/2):(r="right",d=this.right)):r="right",{textAlign:r,x:d}}_computeLabelArea(){if(this.options.ticks.mirror)return;const e=this.chart,t=this.options.position;return"left"===t||"right"===t?{top:0,left:this.left,bottom:e.height,right:this.right}:"top"===t||"bottom"===t?{top:this.top,left:0,bottom:this.bottom,right:e.width}:void 0}drawBackground(){const{ctx:e,options:{backgroundColor:t},left:s,top:i,width:n,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(s,i,n,a),e.restore())}getLineWidthForValue(e){const t=this.options.grid;if(!this._isVisible()||!t.display)return 0;const s=this.ticks,i=s.findIndex(t=>t.value===e);if(i>=0){const e=t.setContext(this.getContext(i));return e.lineWidth}return 0}drawGrid(e){const t=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e));let n,a;const o=(e,t,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(e.x,e.y),s.lineTo(t.x,t.y),s.stroke(),s.restore())};if(t.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:t,draw:e=>{this.drawLabels(e)}}]:[{z:t,draw:e=>{this.draw(e)}}]}getMatchingVisibleMetas(e){const t=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=t.length;n{const i=s.split("."),n=i.pop(),a=[e].concat(i).join("."),o=t[s].split("."),l=o.pop(),r=o.join(".");cn.route(a,n,r,l)})}function kr(e){return"id"in e&&"defaults"in e}class wr{constructor(){this.controllers=new xr(Po,"datasets",!0),this.elements=new xr(Jl,"elements"),this.plugins=new xr(Object,"plugins"),this.scales=new xr(yr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each("register",e)}remove(...e){this._each("unregister",e)}addControllers(...e){this._each("register",e,this.controllers)}addElements(...e){this._each("register",e,this.elements)}addPlugins(...e){this._each("register",e,this.plugins)}addScales(...e){this._each("register",e,this.scales)}getController(e){return this._get(e,this.controllers,"controller")}getElement(e){return this._get(e,this.elements,"element")}getPlugin(e){return this._get(e,this.plugins,"plugin")}getScale(e){return this._get(e,this.scales,"scale")}removeControllers(...e){this._each("unregister",e,this.controllers)}removeElements(...e){this._each("unregister",e,this.elements)}removePlugins(...e){this._each("unregister",e,this.plugins)}removeScales(...e){this._each("unregister",e,this.scales)}_each(e,t,s){[...t].forEach(t=>{const i=s||this._getRegistryForType(t);s||i.isForType(t)||i===this.plugins&&t.id?this._exec(e,i,t):Vs(t,t=>{const i=s||this._getRegistryForType(t);this._exec(e,i,t)})})}_exec(e,t,s){const i=Hs(e);$s(s["before"+i],[],s),t[e](s),$s(s["after"+i],[],s)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(i(t,s),e,"stop"),this._notify(i(s,t),e,"start")}}function Fr(e){const t={},s=[],i=Object.keys(Cr.plugins.items);for(let a=0;a1&&Vr(e[0].toLowerCase());if(t)return t}throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function Ur(e,t,s){if(s[t+"AxisID"]===e)return{axis:t}}function Ir(e,t){if(t.data&&t.data.datasets){const s=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(s.length)return Ur(e,"x",s[0])||Ur(e,"y",s[0])}return{}}function Or(e,t){const s=an[e.type]||{scales:{}},i=t.scales||{},n=Dr(e.type,t),a=Object.create(null);return Object.keys(i).forEach(t=>{const o=i[t];if(!Fs(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const l=Er(t,o,Ir(t,e),cn.scales[o.type]),r=$r(l,n),d=s.scales||{};a[t]=Rs(Object.create(null),[{axis:l},o,d[l],d[r]])}),e.data.datasets.forEach(s=>{const n=s.type||e.type,o=s.indexAxis||Dr(n,t),l=an[n]||{},r=l.scales||{};Object.keys(r).forEach(e=>{const t=Ar(e,o),n=s[t+"AxisID"]||t;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:t},i[n],r[e]])})}),Object.keys(a).forEach(e=>{const t=a[e];Rs(t,[cn.scales[t.type],cn.scale])}),a}function Rr(e){const t=e.options||(e.options={});t.plugins=Ps(t.plugins,{}),t.scales=Or(e,t)}function Wr(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function Br(e){return e=e||{},e.data=Wr(e.data),Rr(e),e}const zr=new Map,Nr=new Set;function jr(e,t){let s=zr.get(e);return s||(s=t(),zr.set(e,s),Nr.add(s)),s}const Hr=(e,t,s)=>{const i=js(t,s);void 0!==i&&e.add(i)};class qr{constructor(e){this._config=Br(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=Wr(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){const e=this._config;this.clearCache(),Rr(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return jr(e,()=>[[`datasets.${e}`,""]])}datasetAnimationScopeKeys(e,t){return jr(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,""]])}datasetElementScopeKeys(e,t){return jr(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,""]])}pluginScopeKeys(e){const t=e.id,s=this.type;return jr(`${s}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){const s=this._scopeCache;let i=s.get(e);return i&&!t||(i=new Map,s.set(e,i)),i}getOptionScopes(e,t,s){const{options:i,type:n}=this,a=this._cachedScopes(e,s),o=a.get(t);if(o)return o;const l=new Set;t.forEach(t=>{e&&(l.add(e),t.forEach(t=>Hr(l,e,t))),t.forEach(e=>Hr(l,i,e)),t.forEach(e=>Hr(l,an[n]||{},e)),t.forEach(e=>Hr(l,cn,e)),t.forEach(e=>Hr(l,on,e))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),Nr.has(t)&&a.set(t,r),r}chartOptionScopes(){const{options:e,type:t}=this;return[e,an[t]||{},cn.datasets[t]||{},{type:t},cn,on]}resolveNamedOptions(e,t,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xr(this._resolverCache,e,i);let l=a;if(Qr(a,t)){n.$shared=!1,s=Xs(s)?s():s;const t=this.createResolver(e,s,o);l=Bn(a,s,t)}for(const r of t)n[r]=l[r];return n}createResolver(e,t,s=[""],i){const{resolver:n}=Xr(this._resolverCache,e,s);return Fs(t)?Bn(n,t,void 0,i):n}}function Xr(e,t,s){let i=e.get(t);i||(i=new Map,e.set(t,i));const n=s.join();let a=i.get(n);if(!a){const e=Wn(t,s);a={resolver:e,subPrefixes:s.filter(e=>!e.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kr=e=>Fs(e)&&Object.getOwnPropertyNames(e).some(t=>Xs(e[t]));function Qr(e,t){const{isScriptable:s,isIndexable:i}=zn(e);for(const n of t){const t=s(n),a=i(n),o=(a||t)&&e[n];if(t&&(Xs(o)||Kr(o))||a&&Ss(o))return!0}return!1}var Yr="4.5.1";const Gr=["top","bottom","left","right","chartArea"];function Jr(e,t){return"top"===e||"bottom"===e||-1===Gr.indexOf(e)&&"x"===t}function Zr(e,t){return function(s,i){return s[e]===i[e]?s[t]-i[t]:s[e]-i[e]}}function ed(e){const t=e.chart,s=t.options.animation;t.notifyPlugins("afterRender"),$s(s&&s.onComplete,[e],t)}function td(e){const t=e.chart,s=t.options.animation;$s(s&&s.onProgress,[e],t)}function sd(e){return ma()&&"string"===typeof e?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const id={},nd=e=>{const t=sd(e);return Object.values(id).filter(e=>e.canvas===t).pop()};function ad(e,t,s){const i=Object.keys(e);for(const n of i){const i=+n;if(i>=t){const a=e[n];delete e[n],(s>0||i>t)&&(e[i+s]=a)}}}function od(e,t,s,i){return s&&"mouseout"!==e.type?i?t:e:null}class ld{static register(...e){Cr.add(...e),rd()}static unregister(...e){Cr.remove(...e),rd()}constructor(e,t){const s=this.config=new qr(t),i=sd(e),n=nd(i);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,d=l&&l.width;this.id=ws(),this.ctx=o,this.canvas=l,this.width=d,this.height=r,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Sr,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Li(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&l?(so.listen(this,"complete",ed),so.listen(this,"progress",td),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:e,maintainAspectRatio:t},width:s,height:i,_aspectRatio:n}=this;return Cs(e)?t&&n?n:i?s/i:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return Cr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Pa(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(e,t){so.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,e,t,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Pa(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const e=this.options,t=e.scales||{};Vs(t,(e,t)=>{e.id=t})}buildOrUpdateScales(){const e=this.options,t=e.scales,s=this.scales,i=Object.keys(s).reduce((e,t)=>(e[t]=!1,e),{});let n=[];t&&(n=n.concat(Object.keys(t).map(e=>{const s=t[e],i=Er(e,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Vs(n,t=>{const n=t.options,a=n.id,o=Er(a,n),l=Ps(n.type,t.dtype);void 0!==n.position&&Jr(n.position,o)===Jr(t.dposition)||(n.position=t.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const e=Cr.getScale(l);r=new e({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,e)}),Vs(i,(e,t)=>{e||delete s[t]}),Vs(s,e=>{Ml.configure(this,e,e.options),Ml.addBox(this,e)})}_updateMetasets(){const e=this._metasets,t=this.data.datasets.length,s=e.length;if(e.sort((e,t)=>e.index-t.index),s>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,s)=>{0===t.filter(t=>t===e._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const e=[],t=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=t.length;s{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(e){const t=this.config;t.update();const s=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:e,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let r=0,d=this.data.datasets.length;r{e.reset()}),this._updateDatasets(e),this.notifyPlugins("afterUpdate",{mode:e}),this._layers.sort(Zr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Vs(this.scales,e=>{Ml.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const e=this.options,t=new Set(Object.keys(this._listeners)),s=new Set(e.events);Ks(t,s)&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of t){const t="_removeElements"===s?-n:n;ad(e,i,t)}}_getUniformDataChanges(){const e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];const t=this.data.datasets.length,s=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+","+e.splice(1).join(","))),i=s(0);for(let n=1;ne.split(",")).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ml.update(this,this.width,this.height,e);const t=this.chartArea,s=t.width<=0||t.height<=0;this._layers=[],Vs(this.boxes,e=>{s&&"chartArea"===e.position||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins("afterLayout")}_updateDatasets(e){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:e,cancelable:!0})){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(e){const t=this.ctx,s={meta:e,index:e.index,cancelable:!0},i=eo(this,e);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(t,i),e.controller.draw(),i&&vn(t),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(e){return yn(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,s,i){const n=hl.modes[t];return"function"===typeof n?n(this,e,s,i):[]}getDatasetMeta(e){const t=this.data.datasets[e],s=this._metasets;let i=s.filter(e=>e&&e._dataset===t).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){const t=this.data.datasets[e];if(!t)return!1;const s=this.getDatasetMeta(e);return"boolean"===typeof s.hidden?!s.hidden:!t.hidden}setDatasetVisibility(e,t){const s=this.getDatasetMeta(e);s.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,s){const i=s?"show":"hide",n=this.getDatasetMeta(e),a=n.controller._resolveAnimations(void 0,i);qs(t)?(n.data[t].hidden=!s,this.update()):(this.setDatasetVisibility(e,s),a.update(n,{visible:s}),this.update(t=>t.datasetIndex===e?i:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){const t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),so.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,s,i),e[s]=i},i=(e,t,s)=>{e.offsetX=t,e.offsetY=s,this._eventHandler(e)};Vs(this.options.events,e=>s(e,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const e=this._responsiveListeners,t=this.platform,s=(s,i)=>{t.addEventListener(this,s,i),e[s]=i},i=(s,i)=>{e[s]&&(t.removeEventListener(this,s,i),delete e[s])},n=(e,t)=>{this.canvas&&this.resize(e,t)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){Vs(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},Vs(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===t&&(n=this.getDatasetMeta(e[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=e.length;o{const s=this.getDatasetMeta(e);if(!s)throw new Error("No dataset found at index "+e);return{datasetIndex:e,element:s.data[t],index:t}}),i=!Ls(s,t);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,t))}notifyPlugins(e,t,s){return this._plugins.notify(this,e,t,s)}isPluginEnabled(e){return 1===this._plugins._cache.filter(t=>t.plugin.id===e).length}_updateHoverStyles(e,t,s){const i=this.options.hover,n=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=n(t,e),o=s?e:n(e,t);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(e,t){const s={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},i=t=>(t.options.events||this.options.events).includes(e.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(e,t,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(e,t,s){const{_active:i=[],options:n}=this,a=t,o=this._getActiveElements(e,i,s,a),l=Qs(e),r=od(e,this._lastEvent,s,l);s&&(this._lastEvent=null,$s(n.onHover,[e,o,this],this),l&&$s(n.onClick,[e,o,this],this));const d=!Ls(o,i);return(d||t)&&(this._active=o,this._updateHoverStyles(o,i,t)),this._lastEvent=r,d}_getActiveElements(e,t,s,i){if("mouseout"===e.type)return[];if(!s)return t;const n=this.options.hover;return this.getElementsAtEventForMode(e,n.mode,n,i)}}function rd(){return Vs(ld.instances,e=>e._plugins.invalidate())}function dd(e,t,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=t,{borderWidth:d,borderJoinStyle:c}=r,h=Math.min(d/o,xi(i-s));if(e.beginPath(),e.arc(n,a,o-d/2,i+h/2,s-h/2),l>0){const t=Math.min(d/l,xi(i-s));e.arc(n,a,l+d/2,s-t/2,i+t/2,!0)}else{const t=Math.min(d/2,o*xi(i-s));if("round"===c)e.arc(n,a,t,s-Ys/2,i+Ys/2,!0);else if("bevel"===c){const o=2*t*t,l=-o*Math.cos(s+Ys/2)+n,r=-o*Math.sin(s+Ys/2)+a,d=o*Math.cos(i+Ys/2)+n,c=o*Math.sin(i+Ys/2)+a;e.lineTo(l,r),e.lineTo(d,c)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip("evenodd")}function cd(e,t,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=t;let d=n/l;e.beginPath(),e.arc(a,o,l,i-d,s+d),r>n?(d=n/r,e.arc(a,o,r,s+d,i-d,!0)):e.arc(a,o,n,s+ti,i-ti),e.closePath(),e.clip()}function hd(e){return $n(e,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(e,t,s,i){const n=hd(e.options.borderRadius),a=(s-t)/2,o=Math.min(a,i*t/2),l=e=>{const t=(s-Math.min(a,e))*i/2;return _i(e,0,Math.min(a,t))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(e,t,s,i){return{x:s+e*Math.cos(t),y:i+e*Math.sin(t)}}function gd(e,t,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:d,innerRadius:c}=t,h=Math.max(t.outerRadius+i+s-d,0),u=c>0?c+i+s+d:0;let p=0;const g=n-r;if(i){const e=c>0?c-i:0,t=h>0?h-i:0,s=(e+t)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*h-s/Ys)/h,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(t,u,h,y-b),w=h-x,C=h-v,S=b+x/w,F=y-v/C,T=u+_,M=u+k,P=b+_/T,D=y-k/M;if(e.beginPath(),a){const t=(S+F)/2;if(e.arc(o,l,h,S,t),e.arc(o,l,h,t,F),v>0){const t=pd(C,F,o,l);e.arc(t.x,t.y,v,F,y+ti)}const s=pd(M,y,o,l);if(e.lineTo(s.x,s.y),k>0){const t=pd(M,D,o,l);e.arc(t.x,t.y,k,y+ti,D+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(e.arc(o,l,u,y-k/u,i,!0),e.arc(o,l,u,i,b+_/u,!0),_>0){const t=pd(T,P,o,l);e.arc(t.x,t.y,_,P+Math.PI,b-ti)}const n=pd(w,b,o,l);if(e.lineTo(n.x,n.y),x>0){const t=pd(w,S,o,l);e.arc(t.x,t.y,x,b-ti,S)}}else{e.moveTo(o,l);const t=Math.cos(S)*h+o,s=Math.sin(S)*h+l;e.lineTo(t,s);const i=Math.cos(F)*h+o,n=Math.sin(F)*h+l;e.lineTo(i,n)}e.closePath()}function fd(e,t,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=t;let r=t.endAngle;if(a){gd(e,t,s,i,r,n);for(let t=0;t=Ys&&0===p&&"miter"!==c&&dd(e,t,f),a||(gd(e,t,s,i,f,n),e.stroke())}(0,Dt.A)(ld,"defaults",cn),(0,Dt.A)(ld,"instances",id),(0,Dt.A)(ld,"overrides",an),(0,Dt.A)(ld,"registry",Cr),(0,Dt.A)(ld,"version",Yr),(0,Dt.A)(ld,"getChart",nd);class bd extends Jl{constructor(e){super(),(0,Dt.A)(this,"circumference",void 0),(0,Dt.A)(this,"endAngle",void 0),(0,Dt.A)(this,"fullCircles",void 0),(0,Dt.A)(this,"innerRadius",void 0),(0,Dt.A)(this,"outerRadius",void 0),(0,Dt.A)(this,"pixelMargin",void 0),(0,Dt.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:e,y:t}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:d,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),h=(this.options.spacing+this.options.borderWidth)/2,u=Ps(c,l-o),p=vi(n,o,l)&&o!==l,g=u>=Gs||p,f=wi(a,r+h,d+h);return g&&f}getCenterPoint(e){const{x:t,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:l,spacing:r}=this.options,d=(i+n)/2,c=(a+o+r+l)/2;return{x:t+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:t,circumference:s}=this,i=(t.offset||0)/4,n=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin="inner"===t.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;e.save();const o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(Ys,s||0)),r=i*l;e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,fd(e,this,r,n,a),md(e,this,r,n,a),e.restore()}}function yd(e,t,s=t){e.lineCap=Ps(s.borderCapStyle,t.borderCapStyle),e.setLineDash(Ps(s.borderDash,t.borderDash)),e.lineDashOffset=Ps(s.borderDashOffset,t.borderDashOffset),e.lineJoin=Ps(s.borderJoinStyle,t.borderJoinStyle),e.lineWidth=Ps(s.borderWidth,t.borderWidth),e.strokeStyle=Ps(s.borderColor,t.borderColor)}function xd(e,t,s){e.lineTo(s.x,s.y)}function vd(e){return e.stepped?_n:e.tension||"monotone"===e.cubicInterpolationMode?kn:xd}function _d(e,t,s={}){const i=e.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=t,r=Math.max(n,o),d=Math.min(a,l),c=nl&&a>l;return{count:i,start:r,loop:t.loop,ilen:d(o+(d?l-e:e))%a,x=()=>{p!==g&&(e.lineTo(m,g),e.lineTo(m,p),e.lineTo(m,f))};for(r&&(h=n[y(0)],e.moveTo(h.x,h.y)),c=0;c<=l;++c){if(h=n[y(c)],h.skip)continue;const t=h.x,s=h.y,i=0|t;i===u?(sg&&(g=s),m=(b*m+t)/++b):(x(),e.lineTo(t,s),u=i,b=0,p=g=s),f=s}x()}function Cd(e){const t=e.options,s=t.borderDash&&t.borderDash.length,i=!e._decimated&&!e._loop&&!t.tension&&"monotone"!==t.cubicInterpolationMode&&!t.stepped&&!s;return i?wd:kd}function Sd(e){return e.stepped?Va:e.tension||"monotone"===e.cubicInterpolationMode?La:$a}function Fd(e,t,s,i){let n=t._path;n||(n=t._path=new Path2D,t.path(n,s,i)&&n.closePath()),yd(e,t.options),e.stroke(n)}function Td(e,t,s,i){const{segments:n,options:a}=t,o=Cd(t);for(const l of n)yd(e,a,l.style),e.beginPath(),o(e,t,l,{start:s,end:s+i-1})&&e.closePath(),e.stroke()}(0,Dt.A)(bd,"id","arc"),(0,Dt.A)(bd,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,Dt.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,Dt.A)(bd,"descriptors",{_scriptable:!0,_indexable:e=>"borderDash"!==e});const Md="function"===typeof Path2D;function Pd(e,t,s,i){Md&&!t.options.segment?Fd(e,t,s,i):Td(e,t,s,i)}class Dd extends Jl{constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){const s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,e,i,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Xa(this,this.options.segment))}first(){const e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){const e=this.segments,t=this.points,s=e.length;return s&&t[e[s-1].end]}interpolate(e,t){const s=this.options,i=e[t],n=this.points,a=ja(this,{property:t,start:i,end:i});if(!a.length)return;const o=[],l=Sd(s);let r,d;for(r=0,d=a.length;r"borderDash"!==e&&"fill"!==e});class $d extends Jl{constructor(e){super(),(0,Dt.A)(this,"parsed",void 0),(0,Dt.A)(this,"skip",void 0),(0,Dt.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,e&&Object.assign(this,e)}inRange(e,t,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(e-n,2)+Math.pow(t-a,2){t=qd(e,t,n);const o=n[e],l=n[t];null!==i?(a.push({x:o.x,y:i}),a.push({x:l.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:l.y}))}),a}function qd(e,t,s){for(;t>e;t--){const e=s[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function Xd(e,t,s,i){return e&&t?i(e[s],t[s]):e?e[s]:t?t[s]:0}function Kd(e,t){let s=[],i=!1;return Ss(e)?(i=!0,s=e):s=Hd(e,t),s.length?new Dd({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Qd(e){return e&&!1!==e.fill}function Yd(e,t,s){const i=e[t];let n=i.fill;const a=[t];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=e[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(e,t,s){const i=tc(e);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],t,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(e,t,s,i){return"-"!==e&&"+"!==e||(s=t+s),!(s===t||s<0||s>=i)&&s}function Zd(e,t){let s=null;return"start"===e?s=t.bottom:"end"===e?s=t.top:Fs(e)?s=t.getPixelForValue(e.value):t.getBasePixel&&(s=t.getBasePixel()),s}function ec(e,t,s){let i;return i="start"===e?s:"end"===e?t.options.reverse?t.min:t.max:Fs(e)?e.value:t.getBaseValue(),i}function tc(e){const t=e.options,s=t.fill;let i=Ps(s&&s.target,s);return void 0===i&&(i=!!t.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sc(e){const{scale:t,index:s,line:i}=e,n=[],a=i.segments,o=i.points,l=ic(t,s);l.push(Kd({x:null,y:t.bottom},i));for(let r=0;r=0;--o){const t=n[o].$filler;t&&(t.line.updateControlPoints(a,t.axis),i&&t.fill&&uc(e.ctx,t,a))}},beforeDatasetsDraw(e,t,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=e.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const t=i[n].$filler;Qd(t)&&uc(e.ctx,t,e.chartArea)}},beforeDatasetDraw(e,t,s){const i=t.meta.$filler;Qd(i)&&"beforeDatasetDraw"===s.drawTime&&uc(e.ctx,i,e.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vc=(e,t)=>{let{boxHeight:s=t,boxWidth:i=t}=e;return e.usePointStyle&&(s=Math.min(s,t),i=e.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(t,s)}},_c=(e,t)=>null!==e&&null!==t&&e.datasetIndex===t.datasetIndex&&e.index===t.index;class kc extends Jl{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,s){this.maxWidth=e,this.maxHeight=t,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const e=this.options.labels||{};let t=$s(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,s)=>e.sort(t,s,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){const{options:e,ctx:t}=this;if(!e.display)return void(this.width=this.height=0);const s=e.labels,i=Un(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=vc(s,n);let r,d;t.font=i.string,this.isHorizontal()?(r=this.maxWidth,d=this._fitRows(a,n,o,l)+10):(d=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,e.maxWidth||this.maxWidth),this.height=Math.min(d,e.maxHeight||this.maxHeight)}_fitRows(e,t,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],d=i+o;let c=e;n.textAlign="left",n.textBaseline="middle";let h=-1,u=-d;return this.legendItems.forEach((e,p)=>{const g=s+t/2+n.measureText(e.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(c+=d,r[r.length-(p>0?0:1)]=0,u+=d,h++),l[p]={left:0,top:u,row:h,width:g,height:i},r[r.length-1]+=g+o}),c}_fitCols(e,t,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],d=a-e;let c=o,h=0,u=0,p=0,g=0;return this.legendItems.forEach((e,a)=>{const{itemWidth:f,itemHeight:m}=wc(s,t,n,e,i);a>0&&u+m+2*o>d&&(c+=h+o,r.push({width:h,height:u}),p+=h+o,g++,h=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},h=Math.max(h,f),u+=m+o}),c+=h,r.push({width:h,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ia(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ui(s,this.left+i,this.right-this.lineWidths[n]);for(const l of t)n!==l.row&&(n=l.row,o=Ui(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+e+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=Ui(s,this.top+e+i,this.bottom-this.columnSizes[n].height);for(const l of t)l.col!==n&&(n=l.col,o=Ui(s,this.top+e+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const e=this.ctx;xn(e,this),this._draw(),vn(e)}}_draw(){const{options:e,columnSizes:t,lineWidths:s,ctx:i}=this,{align:n,labels:a}=e,o=cn.color,l=Ia(e.rtl,this.left,this.width),r=Un(a.font),{padding:d}=a,c=r.size,h=c/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vc(a,c),m=function(e,t,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ps(s.lineWidth,1);if(i.fillStyle=Ps(s.fillStyle,o),i.lineCap=Ps(s.lineCap,"butt"),i.lineDashOffset=Ps(s.lineDashOffset,0),i.lineJoin=Ps(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ps(s.strokeStyle,o),i.setLineDash(Ps(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(e,p/2),d=t+h;bn(i,o,r,d,a.pointStyleWidth&&p)}else{const a=t+Math.max((c-g)/2,0),o=l.leftForLtr(e,p),r=Ln(s.borderRadius);i.beginPath(),Object.values(r).some(e=>0!==e)?Tn(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(e,t,s){Fn(i,s.text,e,t+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ui(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ui(n,this.top+x+d,this.bottom-t[0].height),line:0},Oa(this.ctx,e.textDirection);const v=f+d;this.legendItems.forEach((o,c)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+h+g;let k=u.x,w=u.y;l.setWidth(this.width),y?c>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ui(n,this.left+d,this.right-s[u.line])):c>0&&w+v>this.bottom&&(k=u.x=k+t[u.line].width+d,u.line++,w=u.y=Ui(n,this.top+x+d,this.bottom-t[u.line].height));const C=l.x(k);if(m(C,w,o),k=Ii(f,k+p+h,y?k+_:this.right,e.rtl),b(l.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const e=r.lineHeight;u.y+=Fc(o,e)+d}else u.y+=v}),Ra(this.ctx,e.textDirection)}drawTitle(){const e=this.options,t=e.title,s=Un(t.font),i=En(t.padding);if(!t.display)return;const n=Ia(e.rtl,this.left,this.width),a=this.ctx,o=t.position,l=s.size/2,r=i.top+l;let d,c=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),d=this.top+r,c=Ui(e.align,c,this.right-h);else{const t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);d=r+Ui(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}const u=Ui(o,c,c+h);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=t.color,a.fillStyle=t.color,a.font=s.string,Fn(a,t.text,u,d,s)}_computeTitleHeight(){const e=this.options.title,t=Un(e.font),s=En(e.padding);return e.display?t.lineHeight+s.height:0}_getLegendItemAt(e,t){let s,i,n;if(wi(e,this.left,this.right)&&wi(t,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;se.length>t.length?e:t)),t+s.size/2+i.measureText(n).width}function Sc(e,t,s){let i=e;return"string"!==typeof t.text&&(i=Fc(t,s)),i}function Fc(e,t){const s=e.text?e.text.length:0;return t*s}function Tc(e,t){return!("mousemove"!==e&&"mouseout"!==e||!t.onHover&&!t.onLeave)||!(!t.onClick||"click"!==e&&"mouseup"!==e)}var Mc={id:"legend",_element:kc,start(e,t,s){const i=e.legend=new kc({ctx:e.ctx,options:s,chart:e});Ml.configure(e,i,s),Ml.addBox(e,i)},stop(e){Ml.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,s){const i=e.legend;Ml.configure(e,i,s),i.options=s},afterUpdate(e){const t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,s){const i=t.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),t.hidden=!0):(n.show(i),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{const r=e.controller.getStyle(s?0:void 0),d=En(r.borderWidth);return{text:t[e.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!e.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:e=>!e.startsWith("on"),labels:{_scriptable:e=>!["generateLabels","filter","sort"].includes(e)}}};new WeakMap;const Pc={average(e){if(!e.length)return!1;let t,s,i=new Set,n=0,a=0;for(t=0,s=e.length;te+t)/i.size;return{x:o,y:n/a}},nearest(e,t){if(!e.length)return!1;let s,i,n,a=t.x,o=t.y,l=Number.POSITIVE_INFINITY;for(s=0,i=e.length;s-1?e.split("\n"):e}function $c(e,t){const{element:s,datasetIndex:i,index:n}=t,a=e.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:e,label:o,parsed:a.getParsed(n),raw:e.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Vc(e,t){const s=e.chart.ctx,{body:i,footer:n,title:a}=e,{boxWidth:o,boxHeight:l}=t,r=Un(t.bodyFont),d=Un(t.titleFont),c=Un(t.footerFont),h=a.length,u=n.length,p=i.length,g=En(t.padding);let f=g.height,m=0,b=i.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(b+=e.beforeBody.length+e.afterBody.length,h&&(f+=h*d.lineHeight+(h-1)*t.titleSpacing+t.titleMarginBottom),b){const e=t.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*e+(b-p)*r.lineHeight+(b-1)*t.bodySpacing}u&&(f+=t.footerMarginTop+u*c.lineHeight+(u-1)*t.footerSpacing);let y=0;const x=function(e){m=Math.max(m,s.measureText(e).width+y)};return s.save(),s.font=d.string,Vs(e.title,x),s.font=r.string,Vs(e.beforeBody.concat(e.afterBody),x),y=t.displayColors?o+2+t.boxPadding:0,Vs(i,e=>{Vs(e.before,x),Vs(e.lines,x),Vs(e.after,x)}),y=0,s.font=c.string,Vs(e.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Lc(e,t){const{y:s,height:i}=t;return se.height-i/2?"bottom":"center"}function Ec(e,t,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===e&&n+a+o>t.width||("right"===e&&n-a-o<0||void 0)}function Uc(e,t,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=e;let d="center";return"center"===i?d=n<=(l+r)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Ec(d,e,t,s)&&(d="center"),d}function Ic(e,t,s){const i=s.yAlign||t.yAlign||Lc(e,s);return{xAlign:s.xAlign||t.xAlign||Uc(e,t,s,i),yAlign:i}}function Oc(e,t){let{x:s,width:i}=e;return"right"===t?s-=i:"center"===t&&(s-=i/2),s}function Rc(e,t,s){let{y:i,height:n}=e;return"top"===t?i+=s:i-="bottom"===t?n+s:n/2,i}function Wc(e,t,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=e,{xAlign:l,yAlign:r}=s,d=n+a,{topLeft:c,topRight:h,bottomLeft:u,bottomRight:p}=Ln(o);let g=Oc(t,l);const f=Rc(t,r,d);return"center"===r?"left"===l?g+=d:"right"===l&&(g-=d):"left"===l?g-=Math.max(c,u)+n:"right"===l&&(g+=Math.max(h,p)+n),{x:_i(g,0,i.width-t.width),y:_i(f,0,i.height-t.height)}}function Bc(e,t,s){const i=En(s.padding);return"center"===t?e.x+e.width/2:"right"===t?e.x+e.width-i.right:e.x+i.left}function zc(e){return Dc([],Ac(e))}function Nc(e,t,s){return Rn(e,{tooltip:t,tooltipItems:s,type:"tooltip"})}function jc(e,t){const s=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return s?e.override(s):e}const Hc={beforeTitle:ks,title(e){if(e.length>0){const t=e[0],s=t.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndex{const t={before:[],lines:[],after:[]},n=jc(s,e);Dc(t.before,Ac(qc(n,"beforeLabel",this,e))),Dc(t.lines,qc(n,"label",this,e)),Dc(t.after,Ac(qc(n,"afterLabel",this,e))),i.push(t)}),i}getAfterBody(e,t){return zc(qc(t.callbacks,"afterBody",this,e))}getFooter(e,t){const{callbacks:s}=t,i=qc(s,"beforeFooter",this,e),n=qc(s,"footer",this,e),a=qc(s,"afterFooter",this,e);let o=[];return o=Dc(o,Ac(i)),o=Dc(o,Ac(n)),o=Dc(o,Ac(a)),o}_createItems(e){const t=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=t.length;oe.filter(t,i,n,s))),e.itemSort&&(r=r.sort((t,i)=>e.itemSort(t,i,s))),Vs(r,t=>{const s=jc(e.callbacks,t);i.push(qc(s,"labelColor",this,t)),n.push(qc(s,"labelPointStyle",this,t)),a.push(qc(s,"labelTextColor",this,t))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(e,t){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const e=Pc[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const t=this._size=Vc(this,s),o=Object.assign({},e,t),l=Ic(this.chart,s,o),r=Wc(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),e&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,s,i){const n=this.getCaretPosition(e,s,i);t.lineTo(n.x1,n.y1),t.lineTo(n.x2,n.y2),t.lineTo(n.x3,n.y3)}getCaretPosition(e,t,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:d,bottomRight:c}=Ln(o),{x:h,y:u}=e,{width:p,height:g}=t;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=h,m=f-a,y=x+a,v=x-a):(f=h+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?h+Math.max(l,d)+a:"right"===i?h+p-Math.max(r,c)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(e,t,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=Ia(s.rtl,this.x,this.width);for(e.x=Bc(this,s.titleAlign,s),t.textAlign=r.textAlign(s.titleAlign),t.textBaseline="middle",a=Un(s.titleFont),o=s.titleSpacing,t.fillStyle=s.titleColor,t.font=a.string,l=0;l0!==e)?(e.beginPath(),e.fillStyle=n.multiKeyBackground,Tn(e,{x:t,y:p,w:r,h:l,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),Tn(e,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),e.fill()):(e.fillStyle=n.multiKeyBackground,e.fillRect(t,p,r,l),e.strokeRect(t,p,r,l),e.fillStyle=a.backgroundColor,e.fillRect(s,p+1,r-2,l-2))}e.fillStyle=this.labelTextColors[s]}drawBody(e,t,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:d}=s,c=Un(s.bodyFont);let h=c.lineHeight,u=0;const p=Ia(s.rtl,this.x,this.width),g=function(s){t.fillText(s,p.x(e.x+u),e.y+h/2),e.y+=h+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(t.textAlign=a,t.textBaseline="middle",t.font=c.string,e.x=Bc(this,f,s),t.fillStyle=s.bodyColor,Vs(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+d:r+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],t.fillStyle=b,Vs(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(t,e,x,p,s),h=Math.max(c.lineHeight,l)),v=0,k=y.length;v0&&t.stroke()}_updateAnimationTarget(e){const t=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Pc[e.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Vc(this,e),o=Object.assign({},s,this._size),l=Ic(t,e,o),r=Wc(e,o,l,t);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(e){const t=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(t);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=s,this.drawBackground(n,e,i,t),Oa(e,t.textDirection),n.y+=a.top,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),Ra(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){const s=this._active,i=e.map(({datasetIndex:e,index:t})=>{const s=this.chart.getDatasetMeta(e);if(!s)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:s.data[t],index:t}}),n=!Ls(s,i),a=this._positionChanged(i,t);(n||a)&&(this._active=i,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,s=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(e,n,t,s),o=this._positionChanged(a,e),l=t||!Ls(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),l}_getActiveElements(e,t,s,i){const n=this.options;if("mouseout"===e.type)return[];if(!i)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&void 0!==this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index));const a=this.chart.getElementsAtEventForMode(e,n.mode,n,s);return n.reverse&&a.reverse(),a}_positionChanged(e,t){const{caretX:s,caretY:i,options:n}=this,a=Pc[n.position].call(this,e,t);return!1!==a&&(s!==a.x||i!==a.y)}}(0,Dt.A)(Xc,"positioners",Pc);var Kc={id:"tooltip",_element:Xc,positioners:Pc,afterInit(e,t,s){s&&(e.tooltip=new Xc({chart:e,options:s}))},beforeUpdate(e,t,s){e.tooltip&&e.tooltip.initialize(s)},reset(e,t,s){e.tooltip&&e.tooltip.initialize(s)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const s={tooltip:t};if(!1===e.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;t.draw(e.ctx),e.notifyPlugins("afterTooltipDraw",s)}},afterEvent(e,t){if(e.tooltip){const s=t.replay;e.tooltip.handleEvent(t.event,s,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Hc},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:e=>"filter"!==e&&"itemSort"!==e&&"external"!==e,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Qc=(e,t,s,i)=>("string"===typeof t?(s=e.push(t)-1,i.unshift({index:s,label:t})):isNaN(t)&&(s=null),s);function Yc(e,t,s,i){const n=e.indexOf(t);if(-1===n)return Qc(e,t,s,i);const a=e.lastIndexOf(t);return n!==a?s:n}const Gc=(e,t)=>null===e?null:_i(Math.round(e),0,t);function Jc(e){const t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}}function eh(e,t){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:d,maxTicks:c,maxDigits:h,includeBounds:u}=e,p=a||1,g=c-1,{min:f,max:m}=t,b=!Cs(o),y=!Cs(l),x=!Cs(d),v=(m-f)/(h+1);let _,k,w,C,S=li((m-f)/g/p)*p;if(Sg&&(S=li(C*S/g/p)*p),Cs(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&hi((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,c)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:e})}return y&&u&&w!==l?s.length&&oi(s[s.length-1].value,l,th(l,v,e))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function th(e,t,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*t*(""+e).length;return Math.min(t/a,o)}(0,Dt.A)(Zc,"id","category"),(0,Dt.A)(Zc,"defaults",{ticks:{callback:Jc}});class sh extends yr{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return Cs(e)||("number"===typeof e||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){const{beginAtZero:e}=this.options,{minDefined:t,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=e=>i=t?i:e,o=e=>n=s?n:e;if(e){const e=ai(i),t=ai(n);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(i===n){let t=0===n?1:Math.abs(.05*n);o(n+t),e||a(i-t)}this.min=i,this.max=n}getTickLimit(){const e=this.options.ticks;let t,{maxTicksLimit:s,stepSize:i}=e;return i?(t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,t>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${t} ticks. Limiting to 1000.`),t=1e3)):(t=this.computeTickLimit(),s=s||11),s&&(t=Math.min(s,t)),t}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const e=this.options,t=e.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:!1!==t.includeBounds},n=this._range||this,a=eh(i,n);return"ticks"===e.bounds&&ui(a,this,"value"),e.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const e=this.ticks;let t=this.min,s=this.max;if(super.configure(),this.options.offset&&e.length){const i=(s-t)/Math.max(e.length-1,1)/2;t-=i,s+=i}this._startValue=t,this._endValue=s,this._valueRange=s-t}getLabelForValue(e){return Zi(e,this.chart.options.locale,this.options.ticks.format)}}class ih extends sh{determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=Ts(e)?e:0,this.max=Ts(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){const e=this.isHorizontal(),t=e?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(e?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,n.lineHeight/i))}getPixelForValue(e){return null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}}(0,Dt.A)(ih,"id","linear"),(0,Dt.A)(ih,"defaults",{ticks:{callback:sn.formatters.numeric}});const nh=e=>Math.floor(ni(e)),ah=(e,t)=>Math.pow(10,nh(e)+t);function oh(e){const t=e/Math.pow(10,nh(e));return 1===t}function lh(e,t,s){const i=Math.pow(10,s),n=Math.floor(e/i),a=Math.ceil(t/i);return a-n}function rh(e,t){const s=t-e;let i=nh(s);while(lh(e,t,i)>10)i++;while(lh(e,t,i)<10)i--;return Math.min(i,nh(e))}function dh(e,{min:t,max:s}){t=Ms(e.min,t);const i=[],n=nh(t);let a=rh(t,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,d=Math.round((t-r)*o)/o,c=Math.floor((t-r)/l/10)*l*10;let h=Math.floor((d-c)/Math.pow(10,a)),u=Ms(e.min,Math.round((r+c+h*Math.pow(10,a))*o)/o);while(u=10?h=h<15?15:20:h++,h>=20&&(a++,h=2,o=a>=0?1:o),u=Math.round((r+c+h*Math.pow(10,a))*o)/o;const p=Ms(e.max,u);return i.push({value:p,major:oh(p),significand:h}),i}class ch extends yr{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){const s=sh.prototype.parse.apply(this,[e,t]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=Ts(e)?Math.max(0,e):null,this.max=Ts(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=e===ah(this.min,0)?ah(this.min,-1):ah(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let s=this.min,i=this.max;const n=t=>s=e?s:t,a=e=>i=t?i:e;s===i&&(s<=0?(n(1),a(10)):(n(ah(s,-1)),a(ah(i,1)))),s<=0&&n(ah(i,-1)),i<=0&&a(ah(s,1)),this.min=s,this.max=i}buildTicks(){const e=this.options,t={min:this._userMin,max:this._userMax},s=dh(t,this);return"ticks"===e.bounds&&ui(s,this,"value"),e.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(e){return void 0===e?"0":Zi(e,this.chart.options.locale,this.options.ticks.format)}configure(){const e=this.min;super.configure(),this._startValue=ni(e),this._valueRange=ni(this.max)-ni(e)}getPixelForValue(e){return void 0!==e&&0!==e||(e=this.min),null===e||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(ni(e)-this._startValue)/this._valueRange)}getValueForPixel(e){const t=this.getDecimalForPixel(e);return Math.pow(10,this._startValue+t*this._valueRange)}}function hh(e){const t=e.ticks;if(t.display&&e.display){const e=En(t.backdropPadding);return Ps(t.font&&t.font.size,cn.font.size)+e.height}return 0}function uh(e,t,s){return s=Ss(s)?s:[s],{w:pn(e,t.string,s),h:s.length*t.lineHeight}}function ph(e,t,s,i,n){return e===i||e===n?{start:t-s/2,end:t+s/2}:en?{start:t-s,end:t}:{start:t,end:t+s}}function gh(e){const t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},s=Object.assign({},t),i=[],n=[],a=e._pointLabels.length,o=e.options.pointLabels,l=o.centerPointLabels?Ys/a:0;for(let r=0;rt.r&&(l=(i.end-t.r)/a,e.r=Math.max(e.r,t.r+l)),n.startt.b&&(r=(n.end-t.b)/o,e.b=Math.max(e.b,t.b+r))}function mh(e,t,s){const i=e.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=e.getPointPosition(t,i+n+o,a),d=Math.round(gi(xi(r.angle+ti))),c=_h(r.y,l.h,d),h=xh(d),u=vh(r.x,l.w,h);return{visible:!0,x:r.x,y:c,textAlign:h,left:u,top:c,right:u+l.w,bottom:c+l.h}}function bh(e,t){if(!t)return!0;const{left:s,top:i,right:n,bottom:a}=e,o=yn({x:s,y:i},t)||yn({x:s,y:a},t)||yn({x:n,y:i},t)||yn({x:n,y:a},t);return!o}function yh(e,t,s){const i=[],n=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:hh(a)/2,additionalAngle:o?Ys/n:0};let d;for(let c=0;c270||s<90)&&(e-=t),e}function kh(e,t,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=t;if(!Cs(l)){const s=Ln(t.borderRadius),r=En(t.backdropPadding);e.fillStyle=l;const d=i-r.left,c=n-r.top,h=a-i+r.width,u=o-n+r.height;Object.values(s).some(e=>0!==e)?(e.beginPath(),Tn(e,{x:d,y:c,w:h,h:u,radius:s}),e.fill()):e.fillRect(d,c,h,u)}}function wh(e,t){const{ctx:s,options:{pointLabels:i}}=e;for(let n=t-1;n>=0;n--){const t=e._pointLabelItems[n];if(!t.visible)continue;const a=i.setContext(e.getPointLabelContext(n));kh(s,a,t);const o=Un(a.font),{x:l,y:r,textAlign:d}=t;Fn(s,e._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Ch(e,t,s,i){const{ctx:n}=e;if(s)n.arc(e.xCenter,e.yCenter,t,0,Gs);else{let s=e.getPointPosition(0,t);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[e,t],this);return s||0===s?s:""}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){const e=this.options;e.display&&e.pointLabels.display?gh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,s,i){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,s,i))}getIndexAngle(e){const t=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(e*t+pi(s))}getDistanceFromCenterForValue(e){if(Cs(e))return NaN;const t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(Cs(e))return NaN;const t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){const t=this._pointLabels||[];if(e>=0&&e{if(0!==t||0===t&&this.min<0){l=this.getDistanceFromCenterForValue(e.value);const s=this.getContext(t),o=i.setContext(s),r=n.setContext(s);Sh(this,o,l,a,r)}}),s.display){for(e.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(e.lineWidth=a,e.strokeStyle=n,e.setLineDash(i.borderDash),e.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),r=this.getPointPosition(o,l),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(r.x,r.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const e=this.ctx,t=this.options,s=t.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(i),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!t.reverse)return;const l=s.setContext(this.getContext(o)),r=Un(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){e.font=r.string,a=e.measureText(i.label).width,e.fillStyle=l.backdropColor;const t=En(l.backdropPadding);e.fillRect(-a/2-t.left,-n-r.size/2-t.top,a+t.width,r.size+t.height)}Fn(e,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),e.restore()}drawTitle(){}}(0,Dt.A)(Th,"id","radialLinear"),(0,Dt.A)(Th,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(e){return e},padding:5,centerPointLabels:!1}}),(0,Dt.A)(Th,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,Dt.A)(Th,"descriptors",{angleLines:{_fallback:"grid"}});const Mh={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Ph=Object.keys(Mh);function Dh(e,t){return e-t}function Ah(e,t){if(Cs(t))return null;const s=e._adapter,{parser:i,round:n,isoWeekday:a}=e._parseOpts;let o=t;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!ci(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $h(e,t,s,i){const n=Ph.length;for(let a=Ph.indexOf(e);a=Ph.indexOf(s);a--){const s=Ph[a];if(Mh[s].common&&e._adapter.diff(n,i,s)>=t-1)return s}return Ph[s?Ph.indexOf(s):0]}function Lh(e){for(let t=Ph.indexOf(e)+1,s=Ph.length;t=t?s[i]:s[n];e[a]=!0}}else e[t]=!0}function Uh(e,t,s,i){const n=e._adapter,a=+n.startOf(t[0].value,i),o=t[t.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(t[r].major=!0);return t}function Ih(e,t,s){const i=[],n={},a=t.length;let o,l;for(o=0;o+e.value))}initOffsets(e=[]){let t,s,i=0,n=0;this.options.offset&&e.length&&(t=this.getDecimalForValue(e[0]),i=1===e.length?1-t:(this.getDecimalForValue(e[1])-t)/2,s=this.getDecimalForValue(e[e.length-1]),n=1===e.length?s:(s-this.getDecimalForValue(e[e.length-2]))/2);const a=e.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const e=this._adapter,t=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$h(n.minUnit,t,s,this._getLabelCapacity(t)),o=Ps(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=ci(l)||!0===l,d={};let c,h,u=t;if(r&&(u=+e.startOf(u,"isoWeek",l)),u=+e.startOf(u,r?"day":a),e.diff(s,t,a)>1e5*o)throw new Error(t+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(c=u,h=0;c+e)}getLabelForValue(e){const t=this._adapter,s=this.options.time;return s.tooltipFormat?t.format(e,s.tooltipFormat):t.format(e,s.displayFormats.datetime)}format(e,t){const s=this.options,i=s.time.displayFormats,n=this._unit,a=t||i[n];return this._adapter.format(e,a)}_tickFormatFunction(e,t,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[e,t,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,d=l&&o[l],c=r&&o[r],h=s[t],u=r&&c&&h&&h.major;return this._adapter.format(e,i||(u?c:d))}generateTickLabels(e){let t,s,i;for(t=0,s=e.length;t0?o:1}getDataTimestamps(){let e,t,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(e=0,t=i.length;e=e[l].pos&&t<=e[r].pos&&({lo:l,hi:r}=Si(e,"pos",t)),({pos:i,time:a}=e[l]),({pos:n,time:o}=e[r])):(t>=e[l].time&&t<=e[r].time&&({lo:l,hi:r}=Si(e,"time",t)),({time:i,pos:a}=e[l]),({time:n,pos:o}=e[r]));const d=n-i;return d?a+(o-a)*(t-i)/d:a}(0,Dt.A)(Oh,"id","time"),(0,Dt.A)(Oh,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class Wh extends Oh{constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Rh(t,this.min),this._tableRange=Rh(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){const{min:t,max:s}=this,i=[],n=[];let a,o,l,r,d;for(a=0,o=e.length;a=t&&r<=s&&i.push(r);if(i.length<2)return[{time:t,pos:0},{time:s,pos:1}];for(a=0,o=i.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;const t=this.getDataTimestamps(),s=this.getLabelTimestamps();return e=t.length&&s.length?this.normalize(t.concat(s)):t.length?t:s,e=this._cache.all=e,e}getDecimalForValue(e){return(Rh(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){const t=this._offsets,s=this.getDecimalForPixel(e)/t.factor-t.end;return Rh(this._table,s*this._tableRange+this._minPos,!0)}}(0,Dt.A)(Wh,"id","timeseries"),(0,Dt.A)(Wh,"defaults",Oh.defaults);var Bh=s(90144);const zh={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},Nh={ariaLabel:{type:String},ariaDescribedby:{type:String}},jh={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...zh,...Nh},Hh="2"===i.rE[0]?(e,t)=>Object.assign(e,{attrs:t}):(e,t)=>Object.assign(e,t);function qh(e){return(0,Bh.ju)(e)?(0,Bh.ux)(e):e}function Xh(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return(0,Bh.ju)(t)?new Proxy(e,{}):e}function Kh(e,t){const s=e.options;s&&t&&Object.assign(s,t)}function Qh(e,t){e.labels=t}function Yh(e,t,s){const i=[];e.datasets=t.map(t=>{const n=e.datasets.find(e=>e[s]===t[s]);return n&&t.data&&!i.includes(n)?(i.push(n),Object.assign(n,t),n):{...t}})}function Gh(e,t){const s={labels:[],datasets:[]};return Qh(s,e.labels),Yh(s,e.datasets,t),s}const Jh=(0,i.pM)({props:jh,setup(e,t){let{expose:s,slots:n}=t;const a=(0,Bh.KR)(null),o=(0,Bh.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:t,data:s,options:i,plugins:n,datasetIdKey:l}=e,r=Gh(s,l),d=Xh(r,s);o.value=new ld(a.value,{type:t,data:d,options:{...i},plugins:n})},r=()=>{const t=(0,Bh.ux)(o.value);t&&(e.destroyDelay>0?setTimeout(()=>{t.destroy(),o.value=null},e.destroyDelay):(t.destroy(),o.value=null))},d=t=>{t.update(e.updateMode)};return(0,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>e.options,()=>e.data],(t,s)=>{let[n,a]=t,[l,r]=s;const c=(0,Bh.ux)(o.value);if(!c)return;let h=!1;if(n){const e=qh(n),t=qh(l);e&&e!==t&&(Kh(c,e),h=!0)}if(a){const t=qh(a.labels),s=qh(r.labels),i=qh(a.datasets),n=qh(r.datasets);t!==s&&(Qh(c.config.data,t),h=!0),i&&i!==n&&(Yh(c.config.data,i,e.datasetIdKey),h=!0)}h&&(0,i.dY)(()=>{d(c)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":e.ariaLabel,"aria-describedby":e.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zh(e,t){return ld.register(t),(0,i.pM)({props:zh,setup(t,s){let{expose:n}=s;const a=(0,Bh.IJ)(null),o=e=>{a.value=e?.chart};return n({chart:a}),()=>(0,i.h)(Jh,Hh({ref:o},{type:e,...t}))}})}const eu=Zh("doughnut",Ko),tu=Zh("line",Qo);s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(e,t,s=!1,i=""){super(e),this.name="BatchOperationError",this.code=t,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:e=>new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(e,t=""){if("AbortError"===e.name)return iu.ABORT();if(e instanceof Response||e&&"number"===typeof e.status){const s=iu[e.status];return s?s(t):new su(`请求失败: ${e.status}`,"HTTP_ERROR",!0,"请稍后重试")}return e instanceof TypeError&&e.message.includes("fetch")?iu.NETWORK():new su(e.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(e={}){this.batchSize=e.batchSize||1e3,this.onProgress=e.onProgress||(()=>{}),this.onError=e.onError||(()=>{}),this.abortController=null}async fetchAllRecords(e=!1){this.abortController=new AbortController;const t=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,e);t.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return t}catch(a){const e=a instanceof su?a:nu(a);throw this.onError(e),e}}async fetchBatch(e,t){const s=new URLSearchParams;e&&s.set("cursor",e),t&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const e=await(0,Mt.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!e.ok){let t="";try{const s=await e.json();t=s.error||""}catch{}throw nu(e,t)}const t=await e.json();if(!t.success)throw new su(t.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:t.records||[],nextCursor:t.nextCursor||null,totalProcessed:t.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class lu{constructor(e={}){this.chunkSize=e.chunkSize||null,this.maxRetries=e.maxRetries||3,this.retryDelay=e.retryDelay||1e3,this.onProgress=e.onProgress||(()=>{}),this.onError=e.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const e=await(0,Mt.A)("/api/manage/batch/index/config");if(!e.ok)throw new Error("获取配置失败");const t=await e.json();if(t.success)return{chunkSize:t.chunkSize||500,databaseType:t.databaseType||"unknown"};throw new Error(t.error||"获取配置失败")}catch(e){return console.warn("Failed to fetch index config, using default:",e),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const e=await this.fetchConfig();this.chunkSize=e.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const e=new ou({onProgress:e=>this.onProgress({...e,phase:"fetching"}),onError:e=>this.onError(e)}),t=await e.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:t.length}),this.sortByTimestampDescending(t),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(t);for(let i=0;i{const s=e.metadata&&e.metadata.TimeStamp||0,i=t.metadata&&t.metadata.TimeStamp||0;return i-s})}splitIntoChunks(e){const t=[];for(let s=0;se.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(e,t=""){switch(e){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${t||e}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(e){return new Promise(t=>setTimeout(t,e))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var ru=lu;class du{constructor(e={}){this.onProgress=e.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:e=>this.onProgress({...e,phase:"fetching"})});const e=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const t={timestamp:Date.now(),version:Pt.rE,data:{fileCount:e.length,files:{},settings:{}}};for(const n of e)t.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();t.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(t);const i=Object.keys(s).length;return{success:!0,fileCount:e.length,settingsCount:i}}async fetchSettings(){try{const e=await(0,Mt.A)("/api/manage/batch/settings");if(!e.ok)return console.warn("Failed to fetch settings:",e.status),{};const t=await e.json();return t.settings||{}}catch(e){return console.warn("Failed to fetch settings:",e),{}}}downloadBackup(e){const t=JSON.stringify(e,null,2),s=new Blob([t],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var cu=du;class hu{constructor(e={}){this.chunkSize=e.chunkSize||50,this.maxRetries=e.maxRetries||3,this.retryDelay=e.retryDelay||1e3,this.onProgress=e.onProgress||(()=>{}),this.onError=e.onError||(()=>{}),this.aborted=!1}async restore(e){if(this.aborted=!1,!e||!e.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:t={},settings:s={}}=e.data,i=Object.entries(t),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,d=0,c=0,h=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const t=this.splitIntoChunks(i,this.chunkSize);for(let e=0;esetTimeout(t,e))}abort(){this.aborted=!0}}var uu=hu;ld.register(bd,Kc,Mc,Zc,ih,$d,Dd,xc);const pu=864e5;function gu(e){return String(e).padStart(2,"0")}function fu(e){return`${e.getFullYear()}-${gu(e.getMonth()+1)}-${gu(e.getDate())}`}function mu(){const e=new Date;e.setHours(0,0,0,0);const t=new Date(e.getTime()-6*pu);return[fu(t),fu(e)]}var bu={name:"SysCogStatus",components:{Doughnut:eu,Line:tu,DateRangeCalendar:q},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Pt.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#2563EB","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},computed:{channelChartData(){const e=this.indexInfo.channelStats||{};return{labels:Object.keys(e),datasets:[{data:Object.values(e),backgroundColor:this.channelColors.slice(0,Object.keys(e).length),borderWidth:0}]}},typeChartData(){const e=this.aggregatedTypeStats;return{labels:Object.keys(e),datasets:[{data:Object.values(e),backgroundColor:this.typeColors.slice(0,Object.keys(e).length),borderWidth:0}]}},aggregatedTypeStats(){const e=this.indexInfo.typeStats||{},t={};for(const[s,i]of Object.entries(e)){const e="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");t[e]=(t[e]||0)+i}return t},currentTrendGroup(){const e=this.indexInfo.uploadTrend||{},t=e.groupBy||{};return t[this.trendGroupBy]||{series:[]}},trendRawLabels(){const e=this.indexInfo.uploadTrend||{};return e.labels||[]},trendRangeCrossesYear(){const e=new Set;return this.trendRawLabels.forEach(t=>{this.extractTrendLabelDates(t).forEach(t=>e.add(t.year))}),e.size>1},trendDisplayLabels(){return this.trendRawLabels.map(e=>this.formatTrendAxisLabel(e))},hasTrendData(){const e=this.indexInfo.uploadTrend||{};return(e.labels||[]).length>0},trendDateDialogWidth(){return window.innerWidth>768?"420px":"90%"},uploadTrendChartData(){const e=this.indexInfo.uploadTrend||{},t=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:e.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...t.map((e,t)=>{const s=this.getTrendColor(t);return{label:this.formatTrendSeriesName(e),data:e.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const e="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:e}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:e=>{const t=e?.[0]?.dataIndex;return this.trendRawLabels[t]||""},label:e=>{const t=e.parsed||{},s=void 0!==t.y?t.y:e.raw;return` ${e.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:e,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:e,precision:0,callback:e=>Number(e).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:e=>{const t=e.raw,s=e.dataset.data.reduce((e,t)=>e+t,0),i=(t/s*100).toFixed(1);return` ${t.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const e=Date.now()-this.processingStartTime,t=this.processingProgress.percentage/100;if(t<=0)return"";const s=e/t,i=s-e;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const e={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return e[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(e){return this.channelColors[e%this.channelColors.length]},getTypeChartColor(e){return this.typeColors[e%this.typeColors.length]},getTrendColor(e){return this.trendColors[e%this.trendColors.length]},formatTrendSeriesName(e){return e?.isOther||"__other__"===e?.name?this.$t("sysStatus.otherChannels"):e?.name||this.$t("sysStatus.unknown")},hexToRgba(e,t){const s=(e||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${t})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${t})`},extractTrendLabelDates(e){const t=String(e||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return t.map(e=>{const[t,s,i]=e.split("-").map(Number);return{year:t,month:s,day:i}})},formatTrendAxisLabel(e){const t=this.extractTrendLabelDates(e);if(0===t.length)return e;const s=(e,t)=>{const s=`${e.month}/${e.day}`;return t?`${e.year}/${s}`:s};if(1===t.length)return s(t[0],this.trendRangeCrossesYear);const[i,n]=t;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(e){Array.isArray(e)&&2===e.length&&e[0]&&e[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:e,endDate:t}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:e,trendEndDate:t}),i=await(0,Mt.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const e=await i.json();this.indexInfo=e}}catch(e){console.error("获取索引信息失败:",e),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new ru({onProgress:e=>this.handleProgress(e),onError:e=>this.handleError(e)});try{const e=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:e.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(e){if("ABORTED"!==e.code){const t=e.suggestion?`${e.message}。${e.suggestion}`:e.message;this.$message.error(t),this.processingError={message:e.message,suggestion:e.suggestion,recoverable:e.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new cu({onProgress:e=>this.handleProgress(e)});try{const e=await this.currentBackupGenerator.generateBackup(),t=e.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:e.fileCount.toLocaleString(),settingsCount:e.settingsCount}):this.$t("sysStatus.backupSuccess",{count:e.fileCount.toLocaleString()});this.$message.success(t)}catch(e){if("ABORTED"!==e.code){const t=e.suggestion?`${e.message}。${e.suggestion}`:e.message;this.$message.error(t),this.processingError={message:e.message,suggestion:e.suggestion,recoverable:e.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(e){const t=e.target.files[0];if(t)if(t.name.endsWith(".json")){try{await this.$confirm(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(t)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}e.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(e){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await e.text();let i;try{i=JSON.parse(s)}catch(t){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:e=>this.handleProgress(e),onError:e=>this.handleError(e)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(e=>setTimeout(e,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const e=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+e),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(e){if(!e)return this.$t("sysStatus.unknown");const t=new Date(e);return t.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(e,t){return t&&0!==t?Math.round(e/t*100):0},getTimeAgo(e){if(!e)return"";const t=Date.now(),s=t-e,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},handleImageError(e){this.loadErrors[e]=!0},isValidPreview(e,t){return!this.loadErrors[e]&&(!!t?.metadata?.FileType&&(t.metadata.FileType.includes("image")||t.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(e){if(!e)return!1;if(e.metadata?.FileType?.includes("image"))return!0;const t=e.metadata?.FileName||e.id||"",s=t.substring(t.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(e){if(!e)return!1;if(e.metadata?.FileType?.includes("video"))return!0;const t=e.metadata?.FileName||e.id||"",s=t.substring(t.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(e){e?.id&&window.open("/file/"+e.id+"?from=admin","_blank")},handleProgress(e){this.processingPhase=e.phase,this.processingProgress.message=e.message||"",this.processingProgress.current=e.current||0,"fetching"===e.phase?(this.processingProgress.total=e.total||0,e.total&&e.total>0?this.processingProgress.percentage=Math.min(60,e.current/e.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(e.current+1))):"sorting"===e.phase?(this.processingProgress.percentage=65,this.processingProgress.total=e.total||this.processingProgress.total):"uploading"===e.phase?(this.processingProgress.total=e.total||0,e.total&&e.total>0&&(this.processingProgress.percentage=70+e.current/e.total*25)):"finalizing"===e.phase?this.processingProgress.percentage=97:"building"===e.phase?this.processingProgress.percentage=80:"downloading"===e.phase?this.processingProgress.percentage=95:"restoring_files"===e.phase?(this.processingProgress.total=e.total||0,this.processingProgress.percentage=e.percentage||0):"restoring_settings"===e.phase?(this.processingProgress.total=e.total||0,this.processingProgress.percentage=e.percentage||80):"completed"===e.phase?this.processingProgress.percentage=100:"retrying"===e.phase&&(this.processingProgress.message=e.message)},handleError(e){console.error("批量操作错误:",e),this.processingError={message:e.message,suggestion:e.suggestion,recoverable:e.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,c.A)(bu,[["render",Tt],["__scopeId","data-v-0f8731a4"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687)),Tu=(s(18785),s(97769));const Mu=["onClick"];function Pu(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=Tu.A;return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:t[0]||(t[0]=(...e)=>l.toggleDropdown&&l.toggleDropdown(...e))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:t[1]||(t[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,t=>((0,i.uX)(),(0,i.CE)("div",{key:t.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===t.value}]),onClick:e=>l.selectOption(t.value)},[(0,i.RG)(e.$slots,"option",{option:t},()=>[t.channelType?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:t.channelType,class:(0,n.C4)(["option-icon",t.iconClass])},null,8,["type","class"])):t.icon?((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:t.icon,class:(0,n.C4)(["option-icon",t.iconClass])},null,8,["icon","class"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(t.label),1)],!0)],10,Mu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",components:{ChannelIcon:Tu.A},props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const e=this.options.find(e=>e.value===this.modelValue);return e?e.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(e){this.$emit("update:modelValue",e),this.$emit("change",e),this.isOpen=!1},handleClickOutside(e){this.$el.contains(e.target)||(this.isOpen=!1)}}};const Au=(0,c.A)(Du,[["render",Pu],["__scopeId","data-v-8c87e03e"]]);var $u=Au;const Vu={class:"upload-settings"},Lu={class:"page-header"},Eu={class:"first-title"},Uu={class:"header-actions"},Iu={class:"group-header"},Ou={class:"group-title"},Ru={key:0,class:"load-balance-switch"},Wu={class:"switch-label"},Bu={key:0,class:"channel-cards"},zu=["onMousemove","onMouseleave"],Nu={class:"card-header"},ju={class:"card-title"},Hu={class:"channel-name"},qu={class:"card-body"},Xu={class:"card-info"},Ku={class:"info-item"},Qu={class:"info-text"},Yu={key:0,class:"info-item"},Gu={class:"info-text"},Ju={key:1,class:"info-item"},Zu=["title"],ep={class:"info-item"},tp={class:"info-text"},sp={key:0,class:"info-item"},ip=["title"],np={class:"info-item"},ap={class:"info-text"},op={class:"info-item"},lp={class:"info-text"},rp={class:"info-item"},dp={class:"info-text"},cp={class:"info-item"},hp=["title"],up={key:0,class:"info-item"},pp=["title"],gp={key:0,class:"quota-mini"},fp={class:"quota-text"},mp={class:"card-actions"},bp={key:1,class:"empty-tip"},yp={class:"channel-type-option"},xp={key:0,class:"form-warning",style:{"margin-top":"0"}},vp=["innerHTML"],_p={class:"form-warning"},kp={class:"quota-label"},wp={class:"quota-status"};function Cp(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=$u,h=K.S2,u=Tu.A,p=Fu.u,f=Su.qi,m=k.ve,b=Cu.P9,y=Cu.AV,x=_u.xE,_=wu.WK,S=ku.lq,F=_u.US,T=w.kZ,M=vu.MF,P=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Vu,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Eu,[(0,i.eW)((0,n.v_)(e.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Uu,[(0,i.bF)(c,{modelValue:o.channelFilter,"onUpdate:modelValue":t[0]||(t[0]=e=>o.channelFilter=e),options:l.filterOptions,placeholder:e.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(h,{type:"primary",onClick:t[1]||(t[1]=e=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(e.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Iu,[(0,i.Lk)("div",Ou,[(0,i.bF)(u,{type:s.value,class:"group-icon"},null,8,["type"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(p,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ru,[(0,i.Lk)("span",Wu,(0,n.v_)(e.$t("sysUpload.loadBalance")),1),(0,i.bF)(f,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":e=>l.getSettings(s.value).loadBalance.enabled=e,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Bu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:e=>l.handleCardMouseMove(e,s.value,o),onMouseleave:e=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",Nu,[(0,i.Lk)("div",ju,[(0,i.Lk)("span",Hu,(0,n.v_)(a.name||e.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(f,{modelValue:a.enabled,"onUpdate:modelValue":e=>a.enabled=e,size:"small",onClick:t[2]||(t[2]=(0,C.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",qu,[(0,i.Lk)("div",Xu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Ku,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Qu,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Gu,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Ju,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||e.$t("sysUpload.notSet")),9,Zu)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",ep,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",tp,(0,n.v_)(a.bucketName||e.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",sp,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,ip)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",np,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",ap,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",op,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",lp,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...t[78]||(t[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",dp,(0,n.v_)(a.repo||e.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(p,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",cp,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||e.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",up,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,pp)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",gp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",fp,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",mp,[(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:e=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(e.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"primary",size:"small",onClick:e=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(e.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(h,{text:"",type:"danger",size:"small",onClick:e=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(e.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,zu))),128))])):((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(T,{modelValue:o.showAddDialog,"onUpdate:modelValue":t[35]||(t[35]=e=>o.showAddDialog=e),title:e.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:t[34]||(t[34]=e=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{label:e.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(y,{modelValue:o.newChannel.type,"onUpdate:modelValue":t[3]||(t[3]=e=>o.newChannel.type=e),placeholder:e.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,e=>((0,i.uX)(),(0,i.Wv)(b,{key:e.value,label:e.label,value:e.value},{default:(0,i.k6)(()=>[(0,i.Lk)("span",yp,[(0,i.bF)(u,{type:e.value,class:"select-option-icon"},null,8,["type"]),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",xp,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:e.$t("sysUpload.r2ConfigNote")},null,8,vp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.channelNameImmutableTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.name,"onUpdate:modelValue":t[4]||(t[4]=e=>o.newChannel.name=e),placeholder:e.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":t[5]||(t[5]=e=>o.newChannel.botToken=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":t[6]||(t[6]=e=>o.newChannel.chatId=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":t[7]||(t[7]=e=>o.newChannel.proxyUrl=e),placeholder:e.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:e.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":t[8]||(t[8]=e=>o.newChannel.endpoint=e),placeholder:e.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":t[9]||(t[9]=e=>o.newChannel.cdnDomain=e),placeholder:e.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":t[10]||(t[10]=e=>o.newChannel.bucketName=e),placeholder:e.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.region,"onUpdate:modelValue":t[11]||(t[11]=e=>o.newChannel.region=e),placeholder:e.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":t[12]||(t[12]=e=>o.newChannel.accessKeyId=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":t[13]||(t[13]=e=>o.newChannel.secretAccessKey=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":t[14]||(t[14]=e=>o.newChannel.pathStyle=e)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":t[15]||(t[15]=e=>o.newChannel.quota.enabled=e)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":t[16]||(t[16]=e=>o.newChannel.quota.limitGB=e),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":t[17]||(t[17]=e=>o.newChannel.quota.threshold=e),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:e.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":t[18]||(t[18]=e=>o.newChannel.botToken=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":t[19]||(t[19]=e=>o.newChannel.channelId=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":t[20]||(t[20]=e=>o.newChannel.proxyUrl=e),placeholder:e.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":t[21]||(t[21]=e=>o.newChannel.isNitro=e)},null,8,["modelValue"])]),_:1}),(0,i.Lk)("div",_p,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(e.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:e.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.repo,"onUpdate:modelValue":t[22]||(t[22]=e=>o.newChannel.repo=e),placeholder:e.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.token,"onUpdate:modelValue":t[23]||(t[23]=e=>o.newChannel.token=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":t[24]||(t[24]=e=>o.newChannel.isPrivate=e)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:e.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":t[25]||(t[25]=e=>o.newChannel.baseUrl=e),placeholder:e.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.username,"onUpdate:modelValue":t[26]||(t[26]=e=>o.newChannel.username=e),placeholder:e.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.password,"onUpdate:modelValue":t[27]||(t[27]=e=>o.newChannel.password=e),type:"password","show-password":"",placeholder:e.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":t[28]||(t[28]=e=>o.newChannel.publicUrl=e),placeholder:e.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":t[29]||(t[29]=e=>o.newChannel.headersText=e),type:"textarea",autosize:{minRows:2},placeholder:e.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":t[30]||(t[30]=e=>o.newChannel.createDirectory=e)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":t[31]||(t[31]=e=>o.newChannel.quota.enabled=e)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":t[32]||(t[32]=e=>o.newChannel.quota.limitGB=e),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":t[33]||(t[33]=e=>o.newChannel.quota.threshold=e),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showDetailDialog,"onUpdate:modelValue":t[37]||(t[37]=e=>o.showDetailDialog=e),title:e.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:t[36]||(t[36]=e=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(P,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(M,{label:e.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?e.$t("sysUpload.enabled"):e.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(M,{key:0,label:e.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(M,{label:e.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||e.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(M,{key:2,label:e.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||e.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(M,{label:e.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.cdnDomain||e.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?e.$t("sysUpload.isPathStyle"):e.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(M,{label:e.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||e.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?e.$t("sysUpload.isPathStyle"):e.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(M,{label:e.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?e.$t("sysUpload.isPathStyle"):e.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(M,{label:e.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":o.currentChannel?.publicUrl||e.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||e.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?e.$t("sysUpload.isPathStyle"):e.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(M,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(M,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(M,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",kp,[(0,i.eW)((0,n.v_)(e.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(h,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",wp,[(0,i.bF)(m,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(T,{modelValue:o.showEditDialog,"onUpdate:modelValue":t[77]||(t[77]=e=>o.showEditDialog=e),title:e.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(h,{onClick:t[76]||(t[76]=e=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(h,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(F,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(x,{prop:"name"},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.channelNameLabel"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.channelNameEditDisabledTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"exclamation-triangle",class:"inline-warning-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.name,"onUpdate:modelValue":t[38]||(t[38]=e=>o.editChannel.name=e),disabled:""},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":t[39]||(t[39]=e=>o.editChannel.enabled=e)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":t[40]||(t[40]=e=>o.editChannel.botToken=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":t[41]||(t[41]=e=>o.editChannel.chatId=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":t[42]||(t[42]=e=>o.editChannel.proxyUrl=e),placeholder:e.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(x,{label:e.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":t[43]||(t[43]=e=>o.editChannel.publicUrl=e)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":t[44]||(t[44]=e=>o.editChannel.quota.enabled=e),onChange:t[45]||(t[45]=e=>l.onQuotaEnabledChange(e,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":t[46]||(t[46]=e=>o.editChannel.quota.limitGB=e),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":t[47]||(t[47]=e=>o.editChannel.quota.threshold=e),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(x,{label:e.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":t[48]||(t[48]=e=>o.editChannel.endpoint=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.cdnDomain"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.cdnDomainTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":t[49]||(t[49]=e=>o.editChannel.cdnDomain=e),placeholder:e.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":t[50]||(t[50]=e=>o.editChannel.bucketName=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.region,"onUpdate:modelValue":t[51]||(t[51]=e=>o.editChannel.region=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":t[52]||(t[52]=e=>o.editChannel.accessKeyId=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":t[53]||(t[53]=e=>o.editChannel.secretAccessKey=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.pathStyle"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.pathStyleTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":t[54]||(t[54]=e=>o.editChannel.pathStyle=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":t[55]||(t[55]=e=>o.editChannel.quota.enabled=e),onChange:t[56]||(t[56]=e=>l.onQuotaEnabledChange(e,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":t[57]||(t[57]=e=>o.editChannel.quota.limitGB=e),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":t[58]||(t[58]=e=>o.editChannel.quota.threshold=e),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(x,{label:e.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":t[59]||(t[59]=e=>o.editChannel.botToken=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":t[60]||(t[60]=e=>o.editChannel.channelId=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":t[61]||(t[61]=e=>o.editChannel.proxyUrl=e),placeholder:e.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.nitroMember"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.nitroTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":t[62]||(t[62]=e=>o.editChannel.isNitro=e)},null,8,["modelValue"])]),_:1})],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(x,{label:e.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.repo,"onUpdate:modelValue":t[63]||(t[63]=e=>o.editChannel.repo=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.token,"onUpdate:modelValue":t[64]||(t[64]=e=>o.editChannel.token=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.privateRepo"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.privateRepoTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":t[65]||(t[65]=e=>o.editChannel.isPrivate=e)},null,8,["modelValue"])]),_:1})],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(x,{label:e.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":t[66]||(t[66]=e=>o.editChannel.baseUrl=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.username,"onUpdate:modelValue":t[67]||(t[67]=e=>o.editChannel.username=e),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.password,"onUpdate:modelValue":t[68]||(t[68]=e=>o.editChannel.password=e),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.publicUrl"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.webdavPublicUrlTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":t[69]||(t[69]=e=>o.editChannel.publicUrl=e),placeholder:e.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":t[70]||(t[70]=e=>o.editChannel.headersText=e),type:"textarea",autosize:{minRows:2},placeholder:e.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(x,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysUpload.webdavCreateDirectory"))+" ",1),(0,i.bF)(d,{content:e.$t("sysUpload.webdavCreateDirectoryTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":t[71]||(t[71]=e=>o.editChannel.createDirectory=e)},null,8,["modelValue"])]),_:1}),(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(f,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":t[72]||(t[72]=e=>o.editChannel.quota.enabled=e),onChange:t[73]||(t[73]=e=>l.onQuotaEnabledChange(e,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(x,{label:e.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":t[74]||(t[74]=e=>o.editChannel.quota.limitGB=e),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(x,{label:e.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":t[75]||(t[75]=e=>o.editChannel.quota.threshold=e),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var Sp={components:{ChannelIcon:Tu.A,CustomSelect:$u},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){return[{value:"",label:this.$t("common.all")},...this.channels.map(e=>({value:e.value,label:e.label,channelType:e.value}))]},filteredChannels(){return this.channelFilter?this.channels.filter(e=>e.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(e,t,s){const i=e.currentTarget,n=i.getBoundingClientRect(),a=e.clientX-n.left,o=e.clientY-n.top,l=`glow-${t}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(e,t){const s=`glow-${e}-${t}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelTypeLabel(e){const t=this.channels.find(t=>t.value===e);return t?t.label:e},getChannelList(e){return this.getSettings(e)?.channels||[]},getSettings(e){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return t[e]},hasLoadBalance(e){return["telegram","s3","discord","huggingface","webdav"].includes(e)},maskText(e,t=4){return e?e.length<=2*t?"****":e.slice(0,t)+"****"+e.slice(-t):this.$t("sysUpload.notSet")},formatHeaders(e){return!e||"object"===typeof e&&0===Object.keys(e).length?this.$t("sysUpload.notSet"):"string"===typeof e?e:JSON.stringify(e,null,2)},headersToText(e){return e?"string"===typeof e?e:JSON.stringify(e,null,2):""},parseHeadersText(e){if(!e||!e.trim())return{};try{const t=JSON.parse(e);return!t||"object"!==typeof t||Array.isArray(t)?null:t}catch(t){return null}},openDetailDialog(e,t){this.currentChannelType=e,this.currentChannelIndex=t,this.currentChannel=this.getChannelList(e)[t],this.showDetailDialog=!0},openEditDialog(e,t){this.currentChannelType=e,this.currentChannelIndex=t;const s=this.getChannelList(e)[t];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===e&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:e,name:t}=this.newChannel;this.newChannel={type:e,name:t,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(e=>{if(!e)return;const{type:t,name:s}=this.newChannel,i=this.getSettings(t),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(e=>e.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:t,savePath:"database",enabled:!0,fixed:!1};if("telegram"===t)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===t)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===t)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===t)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===t){const e=this.parseHeadersText(this.newChannel.headersText);if(null===e)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:e,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(e=>{if(!e)return;const t=this.getSettings(this.currentChannelType),s=this.currentChannelIndex,i=t.channels[s]?.name||this.editChannel.name,n={...this.editChannel,name:i};if("webdav"===this.currentChannelType){const e=this.parseHeadersText(n.headersText);if(null===e)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));n.headers=e,n.createDirectory=!1!==n.createDirectory,delete n.headersText}t.channels[this.currentChannelIndex]=n,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(e,t){const s=this.getChannelList(e)[t];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.warning"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(e);s.channels.splice(t,1),s.channels.forEach((e,t)=>{e.id=t+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Mt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const e=await(0,Mt.A)("/api/manage/quota",{method:"POST"}),t=await e.json();if(t.success)this.quotaStats=t.channelStats||{};else{const e=await(0,Mt.A)("/api/manage/quota"),t=await e.json();t.success&&(this.quotaStats=t.quotaStats||{})}}catch(e){console.error("Failed to refresh quota stats:",e)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const e=await(0,Mt.A)("/api/manage/quota"),t=await e.json();t.success&&(this.quotaStats=t.quotaStats||{})}catch(e){console.error("Failed to load quota stats:",e)}},getChannelUsedGB(e){const t=this.quotaStats[e.name];return t?(t.usedMB||0)/1024:0},getQuotaPercentage(e){const t=this.getChannelUsedGB(e),s=e.quota?.limitGB||10,i=t/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(e){const t=this.getQuotaPercentage(e),s=e.quota?.threshold||95;return t>=s?"exception":t>=80?"warning":"success"},getQuotaText(e){const t=this.getChannelUsedGB(e),s=e.quota?.limitGB||10;return`${t.toFixed(2)} / ${s} GB`},isQuotaExceeded(e){const t=this.getQuotaPercentage(e),s=e.quota?.threshold||95;return t>=s},getQuotaStatusText(e){const t=this.getQuotaPercentage(e),s=e.quota?.threshold||95;return t>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:t>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(e,t){if(e&&t.name){const e=this.quotaStats[t.name];e||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const e=await(0,Mt.A)("/api/manage/quota",{method:"POST"}),t=await e.json();t.success?(this.quotaStats=t.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(t.error||""))}catch(e){console.error("Failed to recalculate quota:",e),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Mt.A)("/api/manage/sysConfig/upload").then(e=>e.json()).then(e=>{this.telegramSettings=e.telegram,e.cfr2&&e.cfr2.channels&&(e.cfr2.channels=e.cfr2.channels.map(e=>({...e,quota:e.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=e.cfr2,e.s3&&e.s3.channels&&(e.s3.channels=e.s3.channels.map(e=>({...e,quota:e.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=e.s3,e.discord&&e.discord.channels&&(e.discord.channels=e.discord.channels.map(e=>({...e,proxyUrl:e.proxyUrl||""}))),this.discordSettings=e.discord||{loadBalance:{},channels:[]},e.huggingface&&e.huggingface.channels&&(e.huggingface.channels=e.huggingface.channels.map(e=>({...e,isPrivate:e.isPrivate||!1}))),this.huggingfaceSettings=e.huggingface||{loadBalance:{},channels:[]},e.webdav&&e.webdav.channels&&(e.webdav.channels=e.webdav.channels.map(e=>({...e,username:e.username||"",password:e.password||"",publicUrl:e.publicUrl||"",headers:e.headers||{},createDirectory:!1!==e.createDirectory,quota:e.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=e.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Fp=(0,c.A)(Sp,[["render",Cp],["__scopeId","data-v-0082a519"]]);var Tp=Fp,Mp=s(98469);s(49187);const Pp={class:"save-text"};function Dp(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:t[0]||(t[0]=(...e)=>l.handleClick&&l.handleClick(...e))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",Pp,(0,n.v_)(s.loading?e.$t("floatingSave.saving"):e.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Ap={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(e){e?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const $p=(0,c.A)(Ap,[["render",Dp],["__scopeId","data-v-9cef95d2"]]);var Vp=$p,Lp=s(84757);s(5802),s(64752),s(38736);const Ep={class:"security-settings"},Up={class:"first-settings"},Ip={class:"first-title"},Op={class:"second-title"},Rp={style:{display:"flex",gap:"8px",width:"100%"}},Wp={class:"second-title"},Bp={style:{display:"flex",gap:"8px",width:"100%"}},zp={class:"second-title token-title"},Np={class:"token-actions"},jp={class:"token-table-container"},Hp={class:"table-cell-content"},qp={class:"table-cell-content"},Xp={class:"token-display"},Kp={class:"table-cell-content"},Qp={class:"table-cell-content"},Yp={class:"table-cell-content"},Gp={class:"table-cell-content"},Jp={class:"table-cell-content action-buttons"},Zp={class:"first-settings"},eg={class:"first-title"},tg={class:"second-title"},sg={class:"second-title"},ig={class:"query-param-list"},ng={class:"query-param-list"},ag={class:"first-settings"},og={class:"first-title"},lg={class:"second-title"},rg={class:"second-title"},dg={class:"second-title"},cg={class:"form-item-hint"},hg={class:"form-item-hint"},ug={style:{display:"flex",gap:"10px",width:"100%"}},pg={class:"dialog-footer"},gg={style:{display:"flex",gap:"10px",width:"100%"}},fg={class:"dialog-footer"},mg={class:"token-result"},bg={style:{"margin-bottom":"15px",color:"#e6a23c"}},yg={class:"dialog-footer"};function xg(e,t,s,a,o,l){const r=wu.WK,d=Mp.dI,c=_u.xE,h=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Lp.o8,m=Fu.u,b=Lp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Vp,T=Mp.o5,M=w.kZ,P=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ep,[(0,i.Lk)("div",Up,[(0,i.Lk)("h3",Ip,(0,n.v_)(e.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Op,(0,n.v_)(e.$t("sysSecurity.userAuth")),1),(0,i.bF)(h,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Rp,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":t[0]||(t[0]=e=>o.authSettings.user.authCode=e),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?e.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":t[1]||(t[1]=e=>o.clearUserPassword=e),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:e.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":t[2]||(t[2]=e=>o.authSettings.user.confirmNewUserPassword=e),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Wp,(0,n.v_)(e.$t("sysSecurity.adminAuth")),1),(0,i.bF)(h,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":t[3]||(t[3]=e=>o.authSettings.admin.adminUsername=e),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Bp,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":t[4]||(t[4]=e=>o.authSettings.admin.adminPassword=e),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?e.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":t[5]||(t[5]=e=>o.clearAdminPassword=e),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(c,{label:e.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":t[6]||(t[6]=e=>o.authSettings.admin.confirmNewAdminPassword=e),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",zp,[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",Np,[(0,i.bF)(p,{type:"primary",size:"small",onClick:t[7]||(t[7]=e=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",jp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:e.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Hp,(0,n.v_)(e.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:e.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",qp,[(0,i.Lk)("span",Xp,(0,n.v_)(e.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:e.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Kp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.row.permissions,e=>((0,i.uX)(),(0,i.Wv)(m,{key:e,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(e)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:e.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Qp,(0,n.v_)(l.formatDate(e.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:e.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Yp,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(e.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(e.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:e.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Gp,(0,n.v_)(l.getTokenStatus(e.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:e.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Jp,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:e=>l.editToken(t.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:e=>l.deleteToken(t.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[P,o.tokenLoading]])])]),(0,i.Lk)("div",Zp,[(0,i.Lk)("h3",eg,(0,n.v_)(e.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",tg,[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":t[8]||(t[8]=e=>o.uploadSettings.moderate.enabled=e)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":t[9]||(t[9]=e=>o.uploadSettings.moderate.channel=e),placeholder:e.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:e.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":t[10]||(t[10]=e=>o.uploadSettings.moderate.moderateContentApiKey=e)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(c,{key:1,label:e.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":t[11]||(t[11]=e=>o.uploadSettings.moderate.nsfwApiPath=e),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"]),(0,i.Lk)("h4",sg,[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.ipQuery"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.ipQueryTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(h,{model:o.uploadSettings.ipQuery,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.enableIpQuery")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.ipQuery.enabled,"onUpdate:modelValue":t[12]||(t[12]=e=>o.uploadSettings.ipQuery.enabled=e)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.ipQueryChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.ipQuery.channel,"onUpdate:modelValue":t[13]||(t[13]=e=>o.uploadSettings.ipQuery.channel=e),placeholder:e.$t("sysSecurity.ipQueryChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:e.$t("sysSecurity.customApi"),value:"customApi"},null,8,["label"])]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"customApi"===o.uploadSettings.ipQuery.channel?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(c,{label:e.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.url,"onUpdate:modelValue":t[14]||(t[14]=e=>o.uploadSettings.ipQuery.customApi.url=e),placeholder:"https://api.example.com/ip"},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.queryParams")},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ig,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.params,(t,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"query-param-row"},[(0,i.bF)(r,{modelValue:t.key,"onUpdate:modelValue":e=>t.key=e,placeholder:e.$t("sysSecurity.paramNamePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(r,{modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,placeholder:e.$t("sysSecurity.paramValuePlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:e=>l.removeIpQueryParam(s),disabled:o.uploadSettings.ipQuery.customApi.params.length<=1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryParam},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysSecurity.addQueryParam")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"]),(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.responseFields"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.responseFieldsTip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",ng,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.uploadSettings.ipQuery.customApi.responseFields,(t,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"response-field-row"},[(0,i.bF)(r,{modelValue:o.uploadSettings.ipQuery.customApi.responseFields[s],"onUpdate:modelValue":e=>o.uploadSettings.ipQuery.customApi.responseFields[s]=e,placeholder:e.$t("sysSecurity.responseFieldPathPlaceholder")},null,8,["modelValue","onUpdate:modelValue","placeholder"]),(0,i.bF)(p,{plain:"",circle:"",onClick:e=>l.moveIpQueryResponseField(s,-1),disabled:0===s},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-up"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{plain:"",circle:"",onClick:e=>l.moveIpQueryResponseField(s,1),disabled:s===o.uploadSettings.ipQuery.customApi.responseFields.length-1},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"arrow-down"})]),_:1},8,["onClick","disabled"]),(0,i.bF)(p,{type:"danger",plain:"",circle:"",onClick:e=>l.removeIpQueryResponseField(s)},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"trash-alt"})]),_:1},8,["onClick"])]))),128)),(0,i.bF)(p,{type:"primary",plain:"",onClick:l.addIpQueryResponseField},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"}),(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysSecurity.addResponseField")),1)]),_:1},8,["onClick"])])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",ag,[(0,i.Lk)("h3",og,(0,n.v_)(e.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",lg,(0,n.v_)(e.$t("sysSecurity.domainFilter")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":t[15]||(t[15]=e=>o.accessSettings.allowedDomains=e)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",rg,(0,n.v_)(e.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(h,{model:o.accessSettings,rules:l.accessRules,ref:"accessForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":t[16]||(t[16]=e=>o.accessSettings.whiteListMode=e)},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",dg,(0,n.v_)(e.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(h,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:e.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":t[17]||(t[17]=e=>o.accessSettings.sessionSecure=e)},null,8,["modelValue"])]),_:1}),(0,i.bF)(c,{label:e.$t("sysSecurity.userSessionMaxAge"),prop:"userSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":t[18]||(t[18]=e=>o.accessSettings.userSessionMaxAge=e),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",cg,(0,n.v_)(e.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.adminSessionMaxAge"),prop:"adminSessionMaxAge"},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":t[19]||(t[19]=e=>o.accessSettings.adminSessionMaxAge=e),min:1,max:3650,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",hg,(0,n.v_)(e.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(M,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":t[27]||(t[27]=e=>o.showCreateTokenDialog=e),title:e.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",pg,[(0,i.bF)(p,{onClick:t[26]||(t[26]=e=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":t[20]||(t[20]=e=>o.newToken.name=e),placeholder:e.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":t[21]||(t[21]=e=>o.newToken.permissions=e)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":t[22]||(t[22]=e=>o.newToken.neverExpire=e),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:e.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ug,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":t[23]||(t[23]=e=>o.newToken.expirationValue=e),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":t[24]||(t[24]=e=>o.newToken.expirationUnit=e),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,t=>((0,i.uX)(),(0,i.Wv)(_,{key:t.value,label:e.$t(t.labelKey),value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:e.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":t[25]||(t[25]=e=>o.newToken.autoDelete=e)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(M,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":t[35]||(t[35]=e=>o.showEditTokenDialog=e),title:e.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",fg,[(0,i.bF)(p,{onClick:t[34]||(t[34]=e=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(h,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":t[28]||(t[28]=e=>o.editingToken.name=e),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":t[29]||(t[29]=e=>o.editingToken.permissions=e)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":t[30]||(t[30]=e=>o.editingToken.neverExpire=e),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:0,label:e.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",gg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":t[31]||(t[31]=e=>o.editingToken.expirationValue=e),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":t[32]||(t[32]=e=>o.editingToken.expirationUnit=e),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,t=>((0,i.uX)(),(0,i.Wv)(_,{key:t.value,label:e.$t(t.labelKey),value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(c,{key:1,label:e.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":t[33]||(t[33]=e=>o.editingToken.autoDelete=e)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(M,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":t[38]||(t[38]=e=>o.showTokenResultDialog=e),title:e.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",yg,[(0,i.bF)(p,{type:"primary",onClick:t[37]||(t[37]=e=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.Lk)("p",bg,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(e.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(h,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:e.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(c,{label:e.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":t[36]||(t[36]=e=>o.createdToken.token=e),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[P,o.loading]])}s(81148);const vg={s:1e3,m:6e4,h:36e5,d:864e5};function _g(e,t,s){if(!Number.isFinite(t)||t<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof e?new Date(e):new Date(e.getTime());if(vg[s])return new Date(i.getTime()+t*vg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+t),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+t),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function kg(e){const t=new Date(e),s=t.getFullYear(),i=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0"),l=String(t.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function wg(e,t=new Date){if(null===e||void 0===e)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(e),i=t instanceof Date?t:new Date(t),n=kg(e);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Cg={components:{FloatingSaveButton:Vp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{},ipQuery:{enabled:!1,channel:"customApi",customApi:{url:"",params:[{key:"ip",value:"{ip}"}],responseFields:[]}}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(e,t,s)=>{const i=["%","&","?","#","/"],n=i.some(e=>t&&t.includes(e));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(e,t,s)=>{t?t!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(e,t,s)=>{t?t!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},accessRules(){const e=(e,t,s)=>{!Number.isInteger(t)||t<1||t>3650?s(new Error(this.$t("sysSecurity.sessionMaxAgeInvalid"))):s()};return{userSessionMaxAge:[{validator:e,trigger:"change"}],adminSessionMaxAge:[{validator:e,trigger:"change"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(e,t,s)=>{this.newToken.neverExpire||t&&!(t<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(e,t,s)=>{this.editingToken.neverExpire||t&&!(t<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},methods:{normalizeIpQuerySettings(e={}){const t=e.ipQuery||{},s=t.customApi||{},i=Array.isArray(s.params)&&s.params.length>0?s.params.map(e=>({key:e?.key||"",value:e?.value||""})):[{key:"ip",value:"{ip}"}],n=Array.isArray(s.responseFields)?s.responseFields.map(e=>"string"===typeof e?e:e?.path||""):[];return{...e,moderate:e.moderate||{},ipQuery:{enabled:t.enabled??!1,channel:t.channel||"customApi",customApi:{url:s.url||"",params:i,responseFields:n}}}},addIpQueryParam(){this.uploadSettings.ipQuery.customApi.params.push({key:"",value:""})},removeIpQueryParam(e){this.uploadSettings.ipQuery.customApi.params.length<=1||this.uploadSettings.ipQuery.customApi.params.splice(e,1)},addIpQueryResponseField(){this.uploadSettings.ipQuery.customApi.responseFields.push("")},removeIpQueryResponseField(e){this.uploadSettings.ipQuery.customApi.responseFields.splice(e,1)},moveIpQueryResponseField(e,t){const s=this.uploadSettings.ipQuery.customApi.responseFields,i=e+t;if(i<0||i>=s.length)return;const[n]=s.splice(e,1);s.splice(i,0,n)},handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},handleClearUserPassword(e){e&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(e){e&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(e){const t={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return t[e]||e},formatDate(e){return new Date(e).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const e=await(0,Mt.A)("/api/manage/apiTokens"),t=await e.json();this.apiTokens=t.tokens||[]}catch(e){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async e=>{if(e)try{this.newToken.owner="admin";let e=null,t=!1;this.newToken.neverExpire||(e=_g(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),t=this.newToken.autoDelete);const s=await(0,Mt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:e,autoDelete:t})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(t){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(e){const t=null!==e.expiresAt&&void 0!==e.expiresAt;this.editingToken={id:e.id,name:e.name,owner:e.owner,permissions:[...e.permissions],neverExpire:!t,expirationValue:1,expirationUnit:"d",autoDelete:e.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async e=>{if(e)try{let e=null,t=!1;this.editingToken.neverExpire||(e=_g(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),t=this.editingToken.autoDelete);const s=await(0,Mt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:e,autoDelete:t})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(t){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(e){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const t=await(0,Mt.A)(`/api/manage/apiTokens?id=${e}`,{method:"DELETE"}),s=await t.json();t.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(t){"cancel"!==t&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(e){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(e){e&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(e){e&&(this.editingToken.autoDelete=!1)},getTokenStatus(e){return wg(e)},saveSettings(){let e=[];e.push(new Promise(e=>{this.$refs.userPassForm.validate(t=>{e(t)})})),e.push(new Promise(e=>{this.$refs.adminPassForm.validate(t=>{e(t)})})),e.push(new Promise(e=>{this.$refs.accessForm.validate(t=>{e(t)})})),Promise.all(e).then(e=>{const t=e.every(e=>e);if(!t)return;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.userSessionMaxAge>3650||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge)||this.accessSettings.adminSessionMaxAge>3650)return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Mt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(e=>e.json()).then(e=>{if(e.adminPasswordChanged){const e=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(e),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Mt.A)("/api/manage/sysConfig/security").then(e=>e.json()).then(e=>{this.authSettings=e.auth,this.uploadSettings=this.normalizeIpQuerySettings(e.upload),this.accessSettings=e.access,this.oriUserPassword="",this.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Sg=(0,c.A)(Cg,[["render",xg],["__scopeId","data-v-06fad51f"]]);var Fg=Sg;const Tg={class:"page-settings"},Mg={class:"first-title"},Pg={key:5,class:"announcement-refresh-option"};function Dg(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Cu.P9,h=Cu.AV,u=Su.qi,p=wu.WK,f=Mp.dI,m=_u.xE,b=_u.US,y=Vp,x=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Tg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(s,a)=>((0,i.uX)(),(0,i.CE)("div",{key:a,class:"first-settings"},[(0,i.Lk)("h3",Mg,(0,n.v_)(a),1),(0,i.bF)(b,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s,(s,a)=>((0,i.uX)(),(0,i.Wv)(m,{key:s.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(s,"label"))+" ",1),s.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:l.localized(s,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,disabled:s.fixed,placeholder:l.localized(s,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.Wv)(c,{key:e.value,label:l.localizedOption(e),value:e.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===s.type?((0,i.uX)(),(0,i.Wv)(h,{key:1,modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:e.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(c,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===s.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,disabled:s.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===s.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,type:"textarea",class:(0,n.C4)({"announcement-textarea":"announcement"===s.id}),autosize:{minRows:2,maxRows:"announcement"===s.id?8:void 0},resize:"vertical",disabled:s.fixed,placeholder:l.localized(s,"placeholder"),onMousedown:e=>l.handleTextareaResizeStart(e,s),onInput:e=>l.preserveAnnouncementManualHeight(s)},null,8,["modelValue","onUpdate:modelValue","class","autosize","disabled","placeholder","onMousedown","onInput"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,disabled:s.fixed,placeholder:l.localized(s,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])),"announcement"===s.id?((0,i.uX)(),(0,i.CE)("div",Pg,[(0,i.bF)(f,{modelValue:o.refreshAnnouncement,"onUpdate:modelValue":t[0]||(t[0]=e=>o.refreshAnnouncement=e)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(e.$t("sysPage.refreshAnnouncement")),1)]),_:1},8,["modelValue"])])):(0,i.Q3)("",!0)]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(y,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[x,o.loading]])}var Ag=s(457),$g={components:{FloatingSaveButton:Vp},data(){return{settings:{config:[]},loading:!0,refreshAnnouncement:!1,announcementManualHeight:null,announcementResizeMouseUpHandler:null,announcementHeightFrame:null,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const e={};return this.settings.config&&this.settings.config.forEach(t=>{const s=this.isEn?t.category_en||t.category||this.$t("sysPage.otherSettings"):t.category||this.$t("sysPage.otherSettings");e[s]||(e[s]=[]),e[s].push(t)}),e},currentUploadChannel(){const e=this.settings.config?.find(e=>"defaultUploadChannel"===e.id);return e?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(e,t){if(e!==t){const t=this.settings.config?.find(e=>"defaultChannelName"===e.id);if(t){const s=this.availableChannels[e]||[];s.some(e=>e.name===t.value)||(t.value="")}}}},methods:{localized(e,t){return this.isEn&&e[t+"_en"]?e[t+"_en"]:e[t]||""},localizedOption(e){return this.isEn&&e.label_en?e.label_en:e.label},handleTextareaResizeStart(e,t){if("announcement"!==t.id)return;const s=e.target.closest?.("textarea");if(!s)return;this.announcementResizeMouseUpHandler&&window.removeEventListener("mouseup",this.announcementResizeMouseUpHandler);const i=s.offsetHeight;this.announcementResizeMouseUpHandler=()=>{const e=s.offsetHeight;Math.abs(e-i)>1&&(this.announcementManualHeight=e),this.announcementResizeMouseUpHandler=null},window.addEventListener("mouseup",this.announcementResizeMouseUpHandler,{once:!0})},preserveAnnouncementManualHeight(e){if("announcement"!==e.id||!this.announcementManualHeight)return;this.announcementHeightFrame&&window.cancelAnimationFrame(this.announcementHeightFrame);const t=this.announcementManualHeight;this.announcementHeightFrame=window.requestAnimationFrame(()=>{const e=this.$el.querySelector("textarea.announcement-textarea");e&&(e.style.height=`${t}px`),this.announcementHeightFrame=null})},saveSettings(){(0,Mt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...this.settings,refreshAnnouncement:this.refreshAnnouncement})}).then(()=>{this.refreshAnnouncement=!1,this.$message.success(this.$t("sysPage.settingsSaved"))})},async fetchAvailableChannels(){try{const e=await Ag.A.get("/api/channels");e.data&&(this.availableChannels=e.data)}catch(e){console.error("Failed to fetch available channels:",e)}}},beforeUnmount(){this.announcementResizeMouseUpHandler&&window.removeEventListener("mouseup",this.announcementResizeMouseUpHandler),this.announcementHeightFrame&&window.cancelAnimationFrame(this.announcementHeightFrame)},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Mt.A)("/api/manage/sysConfig/page").then(e=>e.json()).then(e=>{this.settings=e,this.settings.config&&this.settings.config.forEach(e=>{"boolean"===e.type&&("string"===typeof e.value?e.value="true"===e.value:void 0!==e.value&&null!==e.value||(e.value=e.default||!1))})}).finally(()=>{this.loading=!1})}};const Vg=(0,c.A)($g,[["render",Dg],["__scopeId","data-v-7f157eca"]]);var Lg=Vg;const Eg={class:"others-settings"},Ug={class:"first-settings"},Ig={class:"first-title"},Og={class:"first-title"},Rg={class:"first-title"},Wg={class:"first-title"},Bg=["innerHTML"],zg={class:"first-title"};function Ng(e,t,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),d=g.R7,c=Su.qi,h=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Vp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Eg,[(0,i.Lk)("div",Ug,[(0,i.Lk)("h3",Ig,[(0,i.eW)((0,n.v_)(e.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:e.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:e.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":t[0]||(t[0]=e=>o.settings.telemetry.enabled=e),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Og,[(0,i.eW)((0,n.v_)(e.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:e.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:e.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":t[1]||(t[1]=e=>o.settings.cloudflareApiToken.CF_ZONE_ID=e),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:e.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.settings.cloudflareApiToken.CF_EMAIL=e),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":t[3]||(t[3]=e=>o.settings.cloudflareApiToken.CF_API_KEY=e),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Rg,[(0,i.eW)((0,n.v_)(e.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:e.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:e.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":t[4]||(t[4]=e=>o.settings.randomImageAPI.enabled=e),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:e.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":t[5]||(t[5]=e=>o.settings.randomImageAPI.allowedDir=e),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Wg,[(0,i.eW)((0,n.v_)(e.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:e.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:e.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":t[6]||(t[6]=e=>o.settings.publicBrowse.enabled=e),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(e.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:e.$t("sysOthers.openDirectoryTooltip")},null,8,Bg)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":t[7]||(t[7]=e=>o.settings.publicBrowse.allowedDir=e),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",zg,[(0,i.eW)((0,n.v_)(e.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:e.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:e.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(c,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":t[8]||(t[8]=e=>o.settings.webDAV.enabled=e),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:e.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":t[9]||(t[9]=e=>o.settings.webDAV.username=e),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:e.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":t[10]||(t[10]=e=>o.settings.webDAV.password=e),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:e.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":t[11]||(t[11]=e=>o.settings.webDAV.uploadChannel=e),disabled:o.settings.webDAV.fixed,placeholder:e.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:e.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":t[12]||(t[12]=e=>o.settings.webDAV.channelName=e),disabled:o.settings.webDAV.fixed,placeholder:e.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,e=>((0,i.uX)(),(0,i.Wv)(f,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var jg={components:{FloatingSaveButton:Vp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const e=this.settings.webDAV?.uploadChannel;return e&&this.availableChannels[e]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Mt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const e=await(0,Mt.A)("/api/channels");e.ok&&(this.availableChannels=await e.json())}catch(e){console.error("Failed to fetch available channels:",e)}}},mounted(){this.loading=!0,(0,Mt.A)("/api/manage/sysConfig/others").then(e=>e.json()).then(e=>{this.settings=e}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const Hg=(0,c.A)(jg,[["render",Ng],["__scopeId","data-v-69ae97d8"]]);var qg=Hg,Xg=s(48903),Kg={name:"SystemConfig",mixins:[Xg.A],data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(e){this.activeIndex=e.replace("#",""),window.scrollTo(0,0)}},activeIndex(e){const t=`#${e}`;this.$router.push({hash:t})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:xu,SysCogUpload:Tp,SysCogSecurity:Fg,SysCogPage:Lg,SysCogOthers:qg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const e=this.$route.hash.replace("#","");switch(e){case"status":return xu;case"upload":return Tp;case"security":return Fg;case"page":return Lg;case"others":return qg;default:return xu}}},methods:{handleLogout(){const e="/api/auth/logout";fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const e="#status";window.location.hash=e,this.activeIndex=e.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Qg=(0,c.A)(Kg,[["render",x],["__scopeId","data-v-5c6339bf"]]);var Yg=Qg}}]); +//# sourceMappingURL=719.b7883017.js.map \ No newline at end of file diff --git a/frontend-dist/js/719.b7883017.js.gz b/frontend-dist/js/719.b7883017.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..98d2a090513dfb38a72c80f37ac0cbc2ed5b8035 GIT binary patch literal 107055 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∈!f|87km8#I5Ui}F^vw+wt;cs@*zK5sJ{R`L5%Q*{AB>{b_QXRu9-gumW5kJ zjs&)VX_Nb?Sa`bV4gAHv7kWo@5kFZB{3PAHG6Lc-ViV>}n9PhZp|lYl3$fHNv<4Ht z=V;@@BnnMy13Z8zJ5PqeCVG@{Cj}&+g3m~cUor@lWZ3D@M9=J-3?cI)uTm#C$ zok&fDZH{khCl%Wp6WXe+@1)u}I6r5=q*3YxkKzcr17Mwv{DbpzJL4P4#~Z=V?;)}M zHss)aE6Z?}&1z!7{VR$K!9U6TWQ%R=VovYbs>vUYjO8L7N40>~WuSVBhORf{3|ugl zCU<(n@R-wN`L~!xu2p?ZQ&4+h0%-B${Cr7pZE4KpG?!{WUISTAXaa~Gce_FZ$TY$` z;<2fde{?_A&-ymXF)(dokDO6Ha_Bq1$YdZxJ5Z(U)r>}d_B$Vc^2?v_J#KA`KQ8LD z@NF*V9&#S2by%@&l*kXfgzln%-q3%ZpBuyQIE+q0BiktX6RD$D(K&tql+7-e4#T+P z`2p=h?h2eeo`joC1eqH`g3CFnLIirKjiA(N)k#5qV~R$P+%Co?Ljr~LB)2=Q{E}%G zrC8UE@!L6@ehZ50&Uo>6|M~e3e#|C}G1rYoL*0_LRM#*CN;EV_s$xgvkk;F3G#Zo? z8_X=ice(bBxTP}8(8Bjjkz)bemE0{VugjS^WBGl>lz<(hYDQlC;eUMoKmI5`7mUtI zV}U%UQJmg9lXeJ@(rMVm>o0#oFWm2(6BZb1(z{_AZNoYPS1kjIe1LwuE<@XWK()K< zoN4=RI0z!Ii_O04r#+yEXC{QUfNRFMiDe(0Q&?qrCrsRr=R?{zkdFU@3CI69)Z;PJO2RbbVS2*zxwC@ z^5Xm7`PI+=>8b2wn(w5x4@aE3Lc|}wyyFKnQ6&`dlb|OBHj-8eMY)a&M&|MDn@{fE zyEU1aso+N8Fl5>I!$LtfubUM$HGiL`9#f;MzZ+1=4pf4fZ9qu?SwN=0FH5D>r6jI? zJ;|)Bc%Zb|*=x(QmALjsa$OpklbTzg)LdMlJnd#el3JmJ#?G_bpz=ToP5WG;0sA#K z!s~85Ly`Qq0^frpmZQrY88hHtI3`3r;=u*wI&=Mq$5H<#tuK*oO9-t zQ3zC}(9_HU>Y~mXfhg|&AVm`Z7YmZYp-H4(V`B5qfA){O?Q*MgFaF;jJtfBWn@=9R zwg2SNy@y-3ih8?onxYrq|NG~^_|514*YC3fYFOpnm6!FjDeiay1iGhmyGJ|6$*_-J zACgn_XXX^46@!fWH0?!Q$9VK`XV)M->UGgI$3ReqFs%byWH<)ofbcu06xu<>E7ULNhTO-%+&fN!F_wIghd$#@T^Zm>Nt}FL*lHWl| ziEDYO9%NaCl+Ewir(A~HzcNx0jM@H`5p(tO!fwq|w3x`?rw{57M9{Q|4Ya zx;|K*Ok?NGt$J%^)j;0fMK7DiVI1{M)D-$*x{lBEWLl|+ZJ}!P%~cCvwRgaY-)s@X zHY}_0VdRGV@WT~w=C+y~z84+As&H$H@vH&@rz z)>fO>tQ$9O*upIy3wU~gr4=k7Y37)&u47kg-o)2g@$d+1OLF21KHE#^9GLAyd#}xM zx51lQDmL}1EqJ0KyU@@WQ(pRVraaNga&b7n`o(|x^rt`k)jxmy{O|tk`44`K#=M=K zyAL1iKX|yif9K(o2WrA}?noD6Wc5wEx_Z$5|I2q?{NOLO>TkdI=0XJ*QeGfjSA!c%;?)D31DmLcu*r^EiR9AFD!#3rZ)uLZzy~7fjbX zGKFhAbOWJq?T%Hr&ZrF?FlBX=vtEg&0c>d~BV@Irm(oaSsx6H(mbI5PQ6i04g+zik zL!}<+Fa8}0&)@mg&wr`(YnjrOq9ZWM!j2Xg57EOA0`w?t#J3rbJ390O%FIv!K^MvD7rhYf3>6dAjZQ+T7%I%wCx7ynFTVT7zxwCj|MZu?WV6H(a``uW8)#V! z^;pZKknmgAiBwFT=qr2d=j>!^WEaz(i#m19`AphoxqJqZW_2>k#wpb0y(_*uKObcm zRB-D}LR(o@nC1zL38E>Hmf%lr2GM~DL5a*$r-Bg%SFIP8)O z3FU8Z2NZsphGzi8elMnnu1`X_3*4uE|LA~r_Ybh2`&UNDn!w=!?(6Q(Lw<2vOl4{s zyN0!Aw=%U)JIti#uC$K(Xlobzd&v! zA>mdoMOdbq$;N-GeZq)vXXthX5$;{o>a}8j*=$}VTb2M8q$Q0u+*kAT{CuAI=oJK2 zPH|C#%6JUMnHY*Exw*Cd){{r-TK~=8d-41K_lqC=-iz;j_mlth@AL|UDt^T1Ex`CF ziVIjk8FvUKk|fa(rw~*ZVewf40gb-O-4%*I1J|oX8$2f$>AE)QxHd+r0~s2x4TCB2 z!=rudUik|8t-pT$Hy`tbUaG1aRKK59Sz%TIsuKR@|pewE|WDvvQMg;Q2Jc@3+ay2;p8 zPG?$WH7&li(Je1@@8Szxp6RFKW_s?*s0(Wy71p}ety=AMyVhNduD0yyrmPCJ7ENK~+ml+b$S~#H=vAQY?Q9j>qW|HcPBPhyRkVdxYJ((tzVI1S9-gupmRFX&4qX z=0l+|AL_n$Y(&byw6pv0@$Cy6n3%g$$*QAkz%{!Lvzbz5Gj&rd$(wR~;@488=19J_ z-dx0bBaJ5G%n}z;%JPl+x(p87#T@0KuadTvA05=07qsQ#7`;N3Yw?w4LP)+~6GBp^ zCoerI+1L8LSD@c3bKqYg1sTd#!=c+7Zs?IQ2VL@3hurUw4?4u}kt{AUycrGSM5a2D%$O*|s)PwMt@`TK!BCKky~82!W!Tv^PSwHC z9YI)uW9*zI+tJYuQa6JD0~3W1@9B(g@i-la4hcYiJL!->GZ>P*?FBUKda?5n3*wa` z@rY}S5YK@MJsbQ2PDH-oTpNNtfc@@nco>0VEU!p|y6{9N&M2fOG(nh%DCn}kGLptL z?7k64!@Lr!*Vdcx*PWGXx9yu)?#}Y^GQMrCtS;TgXY0$`+s##@ zjalzhuYD)=gjdCl~(E@9>84$Fo74m;>T=@(Kz>%sl?u3 z>gXsge1V+FBcY>lm`gI@Dct~(p6>^Ub-Ts(c8;%-8@9nq!s$Vso=h3UB7JprC$+Sw zUlw7XPg_bYQp_17(y6K4$vIt{OQT?CZNNl<%{Oi&-qBG^kGzz2fi=Kk zypAEL190*FS9EdwdZeNVEC#|iE8Y5DLi~1gI9E{aP)pTj+zg`5F-yjaHD5_hBRNYL zb!;5KTiP`^ifjHQL#p6()Y#ilCJUNVLUjN z12U%!#zw+CqmzaohWsGh zSX*7+G?rWT;M8!8YxXx03`4d!1DPssBSu+@8?nK53`VdduJMgK*VdMrt44t&sM*X- zw@w>a-q(s#f|tM(><++`FlR9K6kFADm^eu_G3n9M-RSYrfoCS9(X?2$mYao=34ffg zP9rW$tN_bT?X=jhHzB^4KUyIv%fRY1TI*nt3XtJ|pytYingaD@SKh~_Otr4hhql*t zaJCFhbRThRK2Y zo*$;3A8sWB+DRXS(9hVxlmaDy=0<&hdoge)8|+O&JB;;{@G=2C0=!>6mypUk#PakR z0(E{ggv5h>m|}J(D0&dF?6}T4{K=BwI_ok&Pji*9+)EUQC_`y=O3D3<7#6`MbNv5} zb;}?rWL4ttzj1hYXrL-1_dvGNBAqA><%F*bbTiJ_X-SI!PX{Un%enFn-)sP|3~nCG z8#aOT?g84PVPtGd^3|~90*puqJTvf8YMgDRjWdTfV()}k{S>2t`I%>gE(7t8f#H~t zCl<_m_o9v$P+{TAghy?jDlqz#0LYsGvQU;~B!TY|XLRa}Sgt3zyiE!8##aUa$Pl+3 za|bxB0%1JoJ$Z_51WOh1J4ZRVlenFEYRWN%lmw;f735dBr_{%FMsNZXYhG;HHil$fckN;; ziAxt#aB{3ubXZnJ<|@v)cMuKJ-DsOzNeq>mK&3zO7n^j6B>}v?I;k>-0|_849TpRw zDFAs@UAVYvV{P8#+E}77RhyS7C~6I})`RN6?)%MEdt-cUkdZ98FRR3#PQ#Bv`>4}huP?nu8NA}xAjzuJ~I zKWK~vx=d(-N5WW2wAw2kK`7WhKd*Y6K?1sA$b3+gYu8=D>YG+Zn5iXkMv!C^ZXU*s z7Sb%|)Czm_n-#hSCb6_L0&J~NBUDzV1bk7GCi3U1QQR@D5YGyAs7I=jas0E)gSXl6 zlZR=Kg1KdXKZ3vZ_Yp{C6OmM^Bzr8i%?6(smcxtkH7GDEJXRQ_L&<;Vtd@|e+Ayp} zOb3D2p{DT-Lxi=iY5<*<@Kc8hme$DJwQFRqwX{M|S#Ld+UUSHl-3?PysZUxKX|95$ zz4Wd{mf1V6{BD`7;=2vKWw;cf$q@hRWup0vj1kE-M>C-zXXEXoNow&ox})W+{u|v< zi~o1=$U^+kqWd|kW)C6s+mJSoxqsCSmVAM6RZ@n+Oo=JaznEY`M<1}I$QbE8kIy-F zEbz9|GW3&a$U+aGUrVI*XyO*;6OUpp9ll8wuuyBRZ3w*QxM3 zXwN5Mo8|bJpHNtuA;9-%o*5dzK?MGMD(^-gJLkG?h<|MI5)S?=6Um8MY^=r0o&xMA z4R`aZ3qgdc_3dDoAw4hb26Q*4c88O8gol>JEBJ|sQCL`LX$fQ&79ed6{I}T_xsb*+ z#hsyxfx3Q)&=nANSTI)Iu(Ur1MuIKubZd@ zRlcs;*x20jJJOxEmBCwUlB(LXypp0cAEXjq#vE~B-0;K0$UyM!Z$}~JatJ2@nolRU zL8&sB&kkC=@13IXoq!sPTWJ^(XOf$-E*@&##|O9N7=ZVmfJ7rOXjD9i1#mRN{osw; zyM`WaSi;HJdUQ7j1Y>O!qHtuyU|z@O(n8QSc=A#mdxM1@{OVtR^y0UE$^o?)P!C=) z!Wz#$sknC3;xo@+!?H4D(SozWK4{7f!|iYQm8qP+bV_%qDe7ijHu#X#K@#8KBeslw|!h4n84_l z^z@=-U<_75fn$_GljbU0ZAg%jjr<~TACjs?;GgWU5>i^>Dpcfo%Yv^3;kX5C(`wcc zL@%|C5sQv{Ak70+Mh_%SURUsk?AGH0$o|)F{x(9z$=BIaN50*t-0)WQ-WZ96l%Eq- ztD`qTGQY0j~xE}d;>C_bhRtl|Vl{Um&tJ>in z-%2)?cKrIEW4Y~TIK-t*H`7s0XaKrc<}d)nRq$L=sURf8m>wp$On1Y5f*7!U z3>EBPjX7YKM(V{!H08lwHl|s?oYyJJppYm4cc5t?=V4gP6I0v!R}l6p?pI$J*!gW% z;y#;uLvS4vitd8?*8tos_WR~AO`{M(o1LlOK0F4^2{;`F7x`=(zktqRSQ00RMjq6M ze}a@%Zt}z$8LT~n0Z11(Fz!dE`7JvJNvupxK0`b<43_SDMwX0ik8dSW2ulkL8Oa5~ zU?1t{z<2S@_~pF-Dq$T{$g#!}{rU`6jRmf;G}MV$Tkt$CBFB|y$q%1-fzM;%#B$`X z@x0p)-aEsgso}zbh2qt4fO(LSN!<|p+4MOj*H&{T=A<~Psf3MOfZ4>#)qTWNuPRmp z`ArpBrCx~J5?D_*2fAY?%{g{b0E4y)XIz(Ca<0yWgU#c3(A8Bt*yMAXO8r_*a@Q(# zlft!{&Rs;=K;-1VCjuHQ^5+x)%=@tda;tSVAh zTH&jzg~b-Q8spo&`t}2ZFqI!5S<~3>7+m#dwCY{|2taE=1*m?3kwyE-Y%S_R#xy~X zBw5PA>8A?|Xz1S5@<7qW6b+2Pz;d0&)=^X(wlsyMI?YVnv`&eyn~svjRk|#*LW*Zg zt8_&shZGOdDOt{sSIwe!y|ZNNDAFxfPFP(O?N55yFtZ%Lx-7R*>81T@ZuP@ql0Jw| zP!Wy<@NVBbl2lMBC71&*_``ud&`;h0Lj5SF&wP5KFT#BJi-iSqem>ol0q>g)AUR-* z0Ck`OjT29`U&e?uP|WO{15lgTz@}Jo3}t z@SxF&`iu9yc!xftVcJ{V4x(ZAPT<9~ez$*glXe$lUXMYH{e!>@k71Vl1ZM~t$-*vT zxi@IVKsU={65rSxiiymB_yCO;wBdI_Gmp7Hli@+a(YYFdm!wEsA0C=U!vLprJcB1R z-u5sHy6^589}Xbv#fJk5{|q4h-#GFQ4PqSh2L>@t=mGqbJcAd0C&Cm|;1vM>K)Q@) z_)m|*(S?5w4QT?nifU=3pQqh|&&4g>h_ zNgw{(KgRzq!+)2KV7~fnKKp~CvC{!t?heWl59rCRcYsifn+?Cau#nr7i*O$=8Z{VB z&Dew}OxNr7{V=!dO6<$1%CHE&Kk)B3Zcp4Bu8ucpkSWd!AZtoD2BN?`P{)t$ZJOh% zK%UZ-&Ve@Je*&f?{vqhsMCS!YSo?lxu0jpGH;cTAtE)CAZ8KJ~Vw2_yi>3>rqo!@j zDr-&4vJ^h;EF;t!SY07A&cnoFmX724iY8eYUM3G<&90Sax3vOOqT#!0U7DfJYik-% z%f&ujxAV{?7i@T?96|n4vpGXsRQmxwbCn^@pHJiK(7Fm?zSx{KZCeBSRNqe6J|&VO zsg-0RitPUH{rAtl^G7U9okyH08_Mg^IdMIP%nl?}Kt=7a7-vb#&qLMtl}T*E!$qTEOLzRudS~xxA1Xuxw&px1$v#(+4)g{};_iL**ezwDETV1!;@%`F*6BB=}tgNiS`#bo)X)mv=!sBLZ zb$!jU$S!-lzP65iySBErdQE1uzCU#Lj40d&U98boF`kcxEGHOC?JWfMnB`PFYFVan z7=>xwJE2L`r**#rN>|c#cZZEFJzwAOJtnR`ZO zn50p^&Xk1)85w?32mZ})BJfli&@gLTBtd_4{A@S2%+U$@q$dsh7i3qKIqu$Zp`m>B z^)&X6j$rBexE*jX0q=x8yX``X9%{Kaf<_u09R>7O91Y--Tv#YRVI}jeCIc^=I==cd zmSqM2X`zpCL>q?i0!1$ z;wY>`_Y6`wcrT8l6C<e+cEX#@V5<>u6Y?&M8mJz|<_;1Tj>EPFPkp?{QzSEAy|&8QY!uT(v;5DwRLUBC7?bhM!Szx*9u{TTBkMl z&`#9vM5`lG&T*iOmexM@!EK(9}d&RhlI4`fF4FMeG+1AdR+`s@1oU7XXL^K!x$;WWx*iS3a9!)2^)+fQQOR{(8M<3TUfnxGS6nbmgs)5KFC+KV%Yk=9>kL1~$jEK= z;?R$iw2o0bMn;~f7p!oddGSGQchx%#CRWuwEWQ!dJs!H867$#C!vik>hP}>UR*a0i ztG;K?>LPpl&0+kkVrM5o`> zp7Yj#@);TVsPF|uHW?XtukaWh9y9WmdJIqMeoFgBM&2$w279KFk@t%u)xUY8`kQa@ zZ<n9vu0pw$~z*Xvc+8&#JMs!PY!rMuOoJJqFodT)o5 z#x>AO9u-S|G>lTO-uFY_$jG5;i#_Lk=nwK6L7kn0L1CpJ=g3(-^#?{q&IY9o2ltj> zwK8&A>cY{13jrge@5M)cSO-qgF>JWtp23(fB>c_Y`}d4C*;h^F>d44(aZKU} zo)lj&NGn52M7uqBInn5-@pz4N+$%%UbKh$0w8#*pB{FdD3>!mo=R7Djo>442cAFKA-nELsh zPAQFfBy5iVE6x@xsWCW)#aThY^(o#u$L{gQz+|O;tc!#_fqOiN{k|8URZDI-l%yA( zY<0UV*a6ee^O^R#-TFZqUS!b*0RSu&jyPL-$5=%^mUj}io-t?C#%@2a+vO~}VWCLC z*4kq0JF`?N)`N=L5|T_8FO!^jDG43&3r1N_akqTx9_m|e$XBCKEn`2}UM@&)?PI2A0`)$Y|*!Kc}h{7$vLK=!J39!CXmNrKof(8qg>L-=lFqU1N56Bgj{u&j}JcSy!=lt9(bc8Z#h!`xBF5l9$y)qVASgNC3G z?~b7Ys1%sB4wsVLT0|j>2y%i(;yt6%duZGdujl|g-R6>>RUu#Fj89&r8}_8Bzd5{! z!e(q+#PmpHO+RHG4?v76)HoXFY>+*1a3ItlXV;ncluslJ$?tORE2D2PrB64S%|!zgATw};MCcna}q zT;Eg&bl#_Y2cT}FQ00R%UHP!$biApZ4l$?2Q!)(Ud7h*aK4;a6p@Gm#Rge_LiOozu ziXEcivv<7Mhb7Dt_^NF^=0tnb53D!gJo5Xn#qPt_Bu(aPIKIWj{;0gz?+xKTpaDIK zy*@&Av7J+WhVh89H7oDVxAgl+-q&$-5T!<5z+kLZ>H2wlNQ|3N>gacN(CB-~F*rV( zUgIE2ccWt(ipBJRNlNc_ClQ?YD|-csCQ#DN*0DE+#NgX{eCJqKc-P81jI1t$6~A*B zx28@r>-o1Tdmi`z1UyTx%Tgf&BXPXOV0aMtohNaS>Bm|=EuZZ$f-4D5(KYhH5C>=^ zOBdKLt@3`MgR1c*G=2u^pIJtj4)pFH3_Hg(eNai8RR8(Lp<=dGqOPAna-Iv!|5ADW!@(ubt2emdc`bAxs_a0|OM0nyG+P&f!E7fJ_3&M_ z{C@JlPvhv~*An;h9)B$Xvf19+IwSaN>upzER0g(bkb2WTt8ux}rM}By8=ym7? z)_J+S&T-{5i_Gn_&2u+*(qcM@W;kPDy!W4ZDg8oj{{d_JF&#wHZht=GC-k7}J-fhU zuaqadQ#sj(Onkm9)qwRX5^er$GRf`@*osIBKZ)!O2Vc~^16>_VB79}G&1;|%Zd34J zlLmIA53El{T5Jsp8gD~QnrFKQ{sf@g(_S+V8+c_TX&fEXI;v9)XI10VRK?)g%hZDv z;`ZTyt*N} z9jlgEE~;h59@;MUBX?eLMy3BrK>_tLW4+z=(@TxC3xN@r9x7CGGYwyItX*L8<4Hs9 zQt&_Im!mdPA_ZI_&(1#dH1?8S-3!uJveeMOi8DY9(N`2_+GM#!zO7m7;dqQc?gy20 z%nuKuQzLJ77)QzS`mi#Al~6}g`NjYo#o=wsuBw&XE$D`Gy3w(^;iVPEP%N!fs#L*9 z%g`*#Do$2J#Gw{+bX|N26HS4foz+1b9z+Qw5n=l&N@&*!8kjnBtJ}R3#r=$o4x=cg z@wolcBO@jIE-mw}FIQ`Wo7N>Rc^<8ryWa^DvgTbkYJ~KJFA_p&RWl;JoO?`JpN%GM zh^*a`3ggRkS=Ke_=vNW`DW~)f-&u}6Y+~S+tP3bt!!bbLfXX6Jzr%VOBpyOUVgTFa zG5k55B%BffJy{%{@-0HI4Y1L~(ZFF!=jj!n70yRt1;?KdzRUO~D|`kgWRjgk>vi5( z!pWSlnb-&$t!Zl5pZrtybo>}+)_X><5NTo&HmI;G(7atC=lu4P_64drV`+N*r54#^o7Nx(^Mh<_BwrntoZd^fQWdpe@(WgL zTTlphCJLc0l+!U6%3&leh_l$GbXHl~qDwn6Zeck8(SryOKIP;-8;rm9lwi`#Nbabz z6Ue)%(S%PUDOP2WMw_GMm@Y#%H2_`K^md5FX^R`-bA?ga=8Ml0es&^vY z7rLH2(HBo=Sk(zLENU4$%bYt}DbKR_6j>y8y?aS=0?IRD04GwHzY%U>!eWT3UVbI= zL};eFG`-u+&nSC#x%p&ujGfI@Hk+&E*<>HSg1KZBeSR}Jh@;c9TM^(*8`h=f4r_W6 z2V-Y%jjR63vnM{CcIvgxzM>ft8ZM@?zc2-8&O`x(`Z~W~#na2}SW(N^S?3DZ_42HX zPp8egDEAsRCD!q>*KRiy`}Sh@t@!S;m+Uw%DSp4sGMDTOSEMvhsrykqy4(#Z>lr&wP3~XTv@32&`T4Y|QYAk>;?3H8Opko@lVmd& zv!9omHCD&?853@7&GL+~PiLDg*7MJAzC1Khy+zONcI9;G&n`7*T1De0j{7?_Tjhz< zzJCRLgjU<Uah7U8wO(c2^F(w1*jq zE_heU@4f3U@R19PMX5r#!vqBz~U%Pb7QeNn?L$e&>QP09~PZ$+eG{p-m-D`3Y zuvsAk=4zNey8PBG*EGe}cu~PwP1GAVXPK&d7(+1aTa!aF-?F{ypnlHMQ!6}g3D^nwQ(~c>kxCX0x70W5#tc&WaT3B zFvf~qcIvsXgx31<>u8!>L~E}9`e|vHdr?VI!yaE+SHr3qKe1c_YF?{U*s!l(jn0PE z^=qlNX>swWWq+9zH?N8_3c>U2K85J=3-U(z*czr2KOB zE3HM=!FDB_2pNc1aep0@mqw8 zhOOl)BFMjM9wkjk|@$qaEC3^gM&(tG9{VvIU@@mG<6qiI>Rc1r} z@hhOw`9Xcz$h2?+zaWw3gA!kVwe4MU62@;8E=RX23(MbZDmFW}7$Mz*VP^@p; zF~vlaG3}&LeD+d@t5C;Rn-}Wj2Q%KIlxqZ*Dl`IxI=+%B^Cd3!E;YYanNLxfFL5z* zsr9d2Wxgc*te3t7D)Y*xB^P0X80g<#Xdy?G84?jX4r9baZUw4BHuQk0@sq{5x}`NO z^g;h}eBee`E5%|rIQ(iPFrxXaixk@i1h9;W?kL7_@Gf|%cfn8&&d)EcjvLPIZy(mFG%aUo!riV;)^< z0Ys%`Pec~;W;qoqUjC{$DLmw2%za#Jc>*TOeGv>bX4Nq$VJ8~K9eR-|eXV#dRiiFL z0~fsD%RB8tZm{=fG_qdkOi0jz@{&pWYSXqZcWRYO`K#(1_a|SyOvf%@>YH+`gtcxe zLcv%!X%!tb%O=rIO>4}l(Nr5VNxzIa;VAGG9cUOIV(tNv^P$ECT6 zU;KzH&2&Txp5m`$N~DMQ%Z_`N!=rq$UrC>3eXn5|XBdv|k9?^Urz*Mx0mys#UaCLL zIrlQeNI4Q-jueS{N_V`UJW_2q<+l%_R4XuzVC7tgE`Dm4e?2a?oEOe3yxX|{%~$?< zo1vRIKaopyQy?t8-i=@KYPk63Uzut1E60XQQl>$4sa>R5vM;$j0-NdeE|6{pzWCa# z&a^fKOYkeXnuQ7YHD148C8m(fx(c(JmZxk_VI6)gMDAtmQTfRa8Z3b`ucKlB+|D$k zh3T~~OUVdyfz_FB&X-T`X3+%ldg(|}mM?ebVs?hLnF!152AL__nRkvG3BUmN#!chp zH}J(Y|FiW?s_m_s@y%KKHpMcjpg;b9vh@bHMi>N3iRcID)FEYSu- znIG|ALZRq@e;W4V_GyRGF6~zIrI08uKNZ#ehXi^hx3)4UQ%M1NIlGbqryCD2AP@$0 ztCIR|yiJM9G6jngytsflX*RGh?9qiyOl#c4w60K7K? zC`vA8V$vYLv^AWF`32?jpkMH0cGRyg7nBg&8O$j16-E=%7H=|~&=Pn4S`yA*#V_IX zOMpkicm-Z5jH8mM{ug&l(YrX+CxyFiEnTY^-%GlqT-xsQ1py%GL!TO5x6GZDmhFm( z)5GiJ=ExU8i{K3IrQ^KXazLG5JlK&wv?*vu%iIlWxmhuD3h?MlJ8zeak<$k=HArrm z`#~+YD(32ohc~*I-R@;DjxMUR89&ui{d||Xr`7UO)m&?izOTcr?4`XB^-j*_hPW&s z@|G*cS@c6x(3|PrGLOPoW>FY`#mU3~R+^PFDaqAnUDTDa)SEAvFJpPOra3b%a~6Af zb?k(HCA}HT!QxXfj#<+ZVM@p(c3yu9JP^~FH6<=L|-7;Vd(d0k$wWbPD9+oZep z6&UARb06OU;AQa<<$eM>7AbiVQqyo;wx2*cmZPVODnm&J{&cDoU;O{t#E#OrHbFK zKvMhSr}b;7w3nAnreme8aJgiqN-ojC(q0h}`ZCI9D*{-1<$|)=3YRffR=<|bE+U() zaCu~9?Q7X=g^LR->t71l?2;szo&v_U$~pQ~yIPy9 z(Ad6KD8qDdHh;DGrBWz=4ZHR#c&ur-YpYy{S*;RcW(Qt-g}%VcpDV~&UZkCXa<NoX9^T*w`8ugx4y)(7t?VV;9#YuW@N_t#v_N@*0m4I&lS0<*U$^0jQS8t(^~0mY8No)m=>-rLfSK< z_q2ikN-!z>muP@{qC{p{?ToO_Fir@nll_^~TVd3DGv6@#6x!xBx~^OP$Z~RDWk4q} zVoY5TxHb1iG5u)h$81aXX#%mlY7#2319Nf=Nn`)$2=15;a&-T$z`-VulqJn|+R}li8Ll=S1;>6<6eaEmy5m z*qQ4em-e(=eUW0%+{C0zpH&kyh-R<5GV4yc()3~{W?TZAioL>bk(sL=pRJ=*d6p3w zP^-w}*F@}VBK9>A`8)-Bk zf&26*h)(KPMrl^RGD@Ri6;xYGOz#$3Go&a{L$?Tuk}P^fNfxDDuL(kG&J>5e>gn$7?%~G{ z8@NkyIR}XE5L^sj3aObUAxB!-=U*gF zb$z^g_3G8D_g=jx6~id*%d1l_k56C9AF?Qh@(9Z99F?Z}5PNj4e5R=Y3+Dv3m&ljF zO83|O#YLZj91s-4WzoANpwq9mLOY7y4YFV-JI(z)K$%7yJSbdy*1|s9_47i>h1U`jdUf4+p_yhyf=#5-}n% z%G~P$yAVJxz~Lx6`nJ3LVYXp?_~C~iT7B%Kfj_{VF3RkWXxT@+Y$>yK`;$jD%aIyf zOw8a4#AS&NKF5O${1f2H6&)_%#l^1cx{pb@^9r9q3kK3g%`klk_X7cRq^>q_|GT@7 zA35}ke|XlxROh)2n}gk@BZ>tH1GDu+EWojsr1(K`JBR-K!wyXG3U;!@A9rk<2~YWY zmYfNqB;Atc9kCOxWCdof2q3ca^UWmj&Ky4_|93Kb17PT9`M}EtN1aT}0gCe+K@tI3 z#Y6W#rSOVg$HhqVh3IzNO!vvNw>8^K&JXOs(dNizeq&7rdpbQh;j$)0NM|38@-iXER`IU zNLr{O0Y!(clqO3C?WMG~hGjJ_stthyQ=DxMhY-<+4_9am-T7$@|79x)8KR54DIM)5 zbO{?lO86^YQ{GooU^St%#LR}tPF}idm@ZnDyQNiK*RL|K{|Bw`To#-K{MsCHwJKjo zBI!9E-E$z6`CxAZ6)HWz*r~NHEoDZRCao+bmmX#LE3;AP?g<0a3mhI>$a=cW{@7h% ze=rLX`z2X|SP3=zkRSW&{$VF9#F>;ItqaGIKcoWURd#c5Sct2R_R5puzwPRHVp1vY{20p4*Y?aVLoDjvxUf=`oq37CY5zQ>ah)=qL{|h zV#@%5*C6O<-vR?Ckd49;i31y``T=AmY*c15`N~UEe-w5iG!=WRJfL`H!**QxJBvpo zc47HD|B&13I7smVz(NB?}#!&3)3LxSwzqHvavngJ&GbT{3!CrF9Orcyw ze$rg#7UjC-_qqiusUS+c;ba_!+f~Xr$#NN$(mSq;t}0_unuTSrgBsUX@V0UVRxSfv zde@)vKuwe_a6S$x_Zfpo!Ta9k1o_0KFWYclSwHL~Hrk84M#I7P5!4{51 zF{8b7p9dwa$n9j2LRa8M4uVNm)~BpoqFnEcd0`l3cgeVx&GjaXUbP~F4B{58 zXR+-dS>k#0V4Jw3LZv&CEQ>-S6P7CvL^m{mY+Y3rVHTCLp4m=zghS%lRzaDhdRvz? ze`!p#MH#ry$_l|Kx#tazIt2ah?J0Krp__fw6IavHsyS5GK}Lo(RKE+l|6S4bb-HLL zb2jacbJ20~j;aeGp)-FaQ-Y*5qB|p#4r#U(N+XJ8( zP>jYEM9O%@4;anPnOcr<<0!xmPLe3;Sob|Yz{77Rf7mp^>{N55F;z!X2Q|M?gH;mub+|N4*r;`P7# z&#(XFZ(jey-@WOa!ntiJW@pZx`^_vU~8m)Bo?W$~?RaQe@P*#IvtW;CCzD#uB?B4fLPi;;CQ1ZlP% z`k6+4(A1*Q^y?)FbLS+_aE)N0Ye_4UhE&d=$!OULMG!`gDax%#R|y_?!C(@28D>Y0 zDjKLK8uV9-nTK9RVj2L~76)2+1oNRb!)RNqQzET#ozr}dL&3c_I?ab6YCiLIVB=lJ zZfqgF@-8U%Z|vY6RI}`lIvH&N$r)_B)mbSPgq|tnG(i^vg7ymI)*rMv8b^~b!$ZFM zfmnFdQgmZfOq7Upp^B2JRycLBC_3EG6uq2Fb9a(pDI}8LbqB}0#GQuu#}?^ z@`!LCN_T;x$MbX5C%@#0kL61O04)7ff!2L+^~ELN3uPEC)L-Z4S9%5bnwyH+cjGkZ zT?S@A|5AZ3mARFY639Y*g{5?9ve^R*H5Dxvswyn!iYx3Peatlogx_hERoI}Ox*%Pu zw>vTA222XZBFpl*?J(9P9cV$pn(RDhhsXWc?R3!qIMHs5_V%mT@-V!f*Om9%1>Iy&e5LePM>Bw;mPS)j;`1bLs&TYqfb~(zph=6 zxATrMR7T}YWl!QFOH=_0eZt650XKP2vJiQsum8pq+M#85k+T;Vl#B^h}?@ zzNx}!RpBP%Z%s(yxsRM7MID6)gaWu)K4aYhn9uYUXT_*B~ z(w@$w1wo%%-asB2h`D116=E@DerSC~w8V@FkpPemn^^TRJ=f&qkKS?wB+jjXI zeZ85Z$4Z}3I22!=#_p6j5B8@+KaB(LtZy9#_|!rpFYa4w@u`JKqPD)(>vlh|@*I6? z?Cj3$oqehAY=PL0M8}VcTJ(cQ*c;6G^YW(*&V?m-Snv6;YjgBKszN{FAXws0?{oA; z!}sr(hhUSla`bUS)9*EW|E%HrcN)Hbx9a<&wEi8o#f{1l)LYrlFUGmw!9$iN6nV*D~Rei=x^M9Fx`&+vHZh~_Rhs`)k< z)oy@ZSF;1+qCcAXZi(ix1I5t=x;r#?Hy)MfIKk;80Jsl|fvmBYjQnuvAj-06Z1t_) zDvUCSf+*=*-@-S%<&^;pbY>i=5I;^wdhz3A;(Yos8oE2NGu%c4_r=6Hy@!tA|L41C zQZJsM*!|eqT}FrQ!`O+|(Ad2{aVF>hem;-UnLBcx-bAPF?!@`RM=#v1iSy(ZdIkS) zeu8%0R}&}r0^N5%iP1BFAX-H`?uqm22k41=>}<-?4-sB;VHv0(bB|}uEM%MKO3~4Z zg|?-`UPLL_Wt`pdCfU&rxuHVX5qh3W^1{(|3q7vw0A%vbNp>VRWmyJ!&OR7}%f6(( z$jJvkAnp@+Mnn_$@gkbMkEQrysXDFRGLT$zEQLWOEJFb=xqTPGrg&WYNp`dq4V#i7 z6o`H*XDm%hu^TEgc6k5B&<%wsNdh;RdnjV;)CHeHQMet(ldR7r(B}-Vq?82ZfoHy8 zMC@B3mKrOud31ohIPy}Czl|z_c}LGf`nYunKG>EVOluHeFX8Y&Ra0CaHiuG#A0>ho zYJ^ZLDG#}Xtt?vwFym^mFg84jO{Jj{+oiY!ROUTceK90mixPA2hS3~rG2hnDOyYEfcUijgc*+gaF!E-G!RDw z`Bge2MA_RqB**|oct(CkD5aOADAJiakU3o_%NDAmBuzg+L3Iqi%!)TTI_r3G>!^iI zXssT-N@?5k_fG5cSHe)^p5;mU8ZbTMUM-)+0^yfBi~({Wjo&Fe^Er)Mk-!CxV-1Y6 zp2wT57LI4|kPqa|@>1zf?jVqbtNuWUtv`Z5kCX%W_vZl2O%@wtFnccBJCKR{DZp#p_5T%@R~*0Wkg zkd$)ABh&67owDfq7BxpLd4WHIEcW2KLKG&|v2gVue4t2QNpwOzL`uA;%0vX9G>&~e zq?AxE3+fk&a)R0-zFz^K3`pT`IfED{V?RxaM%FkFxzc4P@-a+AkP#5B8ZeXWa#9p; z^Jz)rBd~7jsBlb=L9Fg0Mu$ZQOPM#aW;m$=aEy8)nlslaK_bgJ0&h96R`!co!;do{EO-XKvOR zw8(Ry9iC+QX+WLv{!jHXMwMRdlbpu0-{ej3@ITlCrcE+{*$~6*X1#6$g=o8-ajR6W zgV42v{Ywu(c@C16(ETiHe=ti`RP{_N$a5#%4a?ii=K5{ zx`dONvY^zNy5`2U1%P}S&ZH)rRgYP)de<9BK<>@Rx4qbR@Tmv7Y!D=_`LQ+k-9kL@ zo`3^hV=AlSp5>2bQNXpp0`UM$Q3v9EYLs(@&lRBpp&ORn2b1W;%8f=z60^{-Y#8ER zz5;QiVLy_AD$!WY_PXj=AZ;L_OqH2~8VdI>{+SX5(g5%cA<1c!;CJiplu zDV65}d^4FnJch-1vuj*rE^(pUY|`Z}jiWHd_kA1;)0ss&wfVF6RH|#mAH#X`M-?|S z^GV)(=@8mCu*#Xi*-Q7$jOrr2HF7nj1swEmhq*PeGl`i!l_Bb+XsIXhHHe&>&Op0f zl0+xuZB;X)nis$_ylJhZW>`1Ilb3okPjncagfma|5(iId>h>JZkhvTj3ViS808xf) zb%wOgGN;qid!w?RKC0Ez)5v}editQY3##{^nTG0IA<0N0M$m;X=9fE3y&#BA@Q}t$ zoc$zKn;Uf`$V$8u@tSBhua9rwc-8tNDa%!wxcQdG+|_#AU#+&AHfi0P6=F#(b)Fpg z8HQ+PJMajiHF*jzT~aK&=#qj<`sZGbhN*_#0~F1~U;eN4nk( zJrOItT!@B^er>~AT23)>bK$?AM1emzd+%8;d2EZ>_M44Ti>B|hI{I=nDKBabO)^iz z-c3DCD!t54l^aE~Me zUb(T_t>#JYBC@DS6r@XWl=?LI7;}L!VY4C-4%+Nr3e@w^&#V?cT}{sp^b4fLhYN=Y2$DFkBG{oux~O9L7@u9U8E#&}Da|ozm)P zosG?pwip9huJ=_2PjGmvZS;5~m3hQ8>N6NP^qumj@GD1C`drzl$Dykbk5sp?!l!zf z9ly&r>b~L_UVc0g zo4R2<7DVHcqp=HH!&o%5-sMN5dL4BbDp2S5VJv|;3HRw09I$Jzp(;`Jb>PAUn*T0zK8HpwT1Sft}JUt^m-o!bZg4ouY zJdqFCT@&6*y_<2*yfBtm%D6A}P{?vjgsTzT_$3U&uk@`R1VE{i<8)3X8Zba`GtYy$ z5-eXg&jUJuX)x%DSTJx-n$bUlWh(Q>M80H6=uu{PI`e`OOjgP%e>Ll{asjQQ+B|5!#uadqMU)Re4(Gr~itfxbz!a6st7RG}8qexPS*PbQ zI{MJaNXVk1Sd+Yek3WWJkoH&D^j20S8M@TCPSzKXF6JQV9~ve76}AyquGc{MjmY^E zg4D~)`Lv(;%K5N1emGKPeX(GYyf4b$mCQf8oG;I%LDpwVpJlG}sWb(87KT=9{{CEV zNpM%@(Mot{x|QWyI!ydQfd7L4|BeNCbtkqE;#b(ceWk12%Qb>L91e37<4xnfhobzb zPLx;X(N>&aVM>6No^BPsS&`lVO08JG!mfrZ%k}g5gJ@q7?dP%&-nMwJ0NFysU*XZE zR&@06UW@ruk|RMxn*@C(7OkvFB6OvBov2TQII18S&OzEg8`Z{9k%WI{kXX4{3;9LF zf5n~yiMz@IxZU32bgVd3#TGh{Cn#*o_;e6>W5QpSvc&hok;cGG*(0?u=Ui|A_^k!& zqnbI$OY|vEe8;9E-w?iO3E$`$7x5?-g|vPt!{^~72uN2KxpOF>&{V3%-Nj5%E8G-S zZ3|l~!QL+ zz90G-?qv4)dG>9$YiCDEbg~fQlZAUUbIzNe{rfjR{^6US{neWv|LyBP`o-&C{mIvV z{r_J7*Z=mL|NCbPU5kU^yB19gNYaU(#W*@#z#GsF4Z33Yi@!$j%XL+m;F&@BVW_S zXWB0APlDhx>?NWXQK0RpjJB6=e)97-KmOrA{q*0y`N{wO`X_(?`bR(h%|HIAPja8V zv~#g4uSRlKG6`Rh2o^>zhDE;1h9e*Nta`Q+d&Aw#OR~-~vbq*zN|!5=4()0!PpS1F znk1>NTBMHZhm#CzD+Wr%T@s>PSFuP8m*z`Xr#}1><_lM+Uf#btjo_ake_5dDgb=R4 z4WVD2XZHM@WSH$rIcKLd{*8#4!{jGM#}<+zyY#I$fBV&MzWUK`fAyzte)d-u&!dnk z>)^ZDf*+_Vv zByq+T#5s?~aTMY(OZ(Gm`i%Z3aXHb29MrBq1y3KyE<@Z&`qMl|s%w3J%3pIsE#_z6 zms8xZ*OBrwO(g#8PbW#xCn;@l7SE2silwWN6s-VH@vCSwDOf+isP1r^+;#4#@AuL2RIBITi*E=if4_m+l zEU##>)7%0$XVKs@AS!N>=(C8J7K%>^+hlMD|bRfD*V2!^n5;)g>BtOSXK$fw&kZ>()t ztKAPQ2xj&HB#)4T@vE!^;?DQ?rYtRbl=PY8A+kLC?w<95g{(yjSsNCzzGWfnnzfHY z*LNUw0>tmiAbX`B4uZ)LLmE_jJ={n;#R)4X=c~rAO@gO5#R*L>Z1*7(7RnNTGy;?# z1d{|vK_5}u0C~2N@wD{jX#4FU-0{;fWEA4y^&49}zKvuB1;{3rM0`-Y*KH zYTviiOxJrc{W7aF&?JnZGn=2EXN!whI^-I&(Tc7lRdNBDfvi+pV1eoP2q`9o<6A|H zl({T~D4T)*C4acc*+mDt)4aIlVE#6fBvd3>Ww~rfN_=-SNxU=1Ps#tCl)a+27Z+3Y zLH+IShA0tfAW2Bn4G54x(m2wyA8$}iFU!4IBXow9(N!_j-YA#wp>;Q4GIH!?Me||;l8WDv@U-6sEa~7 zN1Cib9I<9;iHjDci`fQE&Re~PxmUV<^S2&{Ld}<;1w$jhNWds^MgdLv_NRbT{V3q6 zB=RAdA{Q4s4d`(}W;ajQR{B?9HV>f7O2LO|OcWx+qnWRrBVFKV!S|<>I?d-H_i;ef ziNRcvJ0~FUJ}_6KUImD{4VbHOcK|NAEo6Im|NI>1NDdn0-ivVzr%DkxpsmRqO6wSncrLFZx>n)OP8~qtRJu8W^|DB{Csb}NQvH*;#?I5 z0eOb}=IRU}IjZ!6gHQ8nf)80$@RV|x)Pg${HITO4KkQ&zB)%6S9l030^s$w-9$-KW zv3z9imEL-d_}9Vii&2NK4^nHE4fv+7aHj?gtKW+Ywk@=TtriPSsd&`4o;==tR%Df) zS}e5W(lZE>-M73LI4S|*8mubhIgEy9{qOERe&kTe!aqFgP|3c81aR@9>I4lY6|r6Y zt^}Fq!LR#RRwrb+or4mT5?sm&E_I?;8r;@Z!ojCRkQcl|_w1$`(0ZDHzh+}b)D%{o5^~&|b1!Wg@{2^k=*d-dp8oJyAd03{$(i&znuOXK9 zEJ;~kP*}wowhJomp`L>&{+_j5Ov|avcQPHfs&zT4tD$f$gGV~!_|<~B1P<1Eqi$U%CZr4L7%<-h*GJBGMpoJxFSR>k!ymd= zr#OFE?2xMUGn(7gYgT8Ln8qgk|YFoSQAOs@r4nw59)_cWZ7ZGv? zu@3et$_6AW22>Rmv*z?Qpy%uK6kDL3)h69lYt|2|V=vvBFVeVJX)Xt0T#Z?Z{h64dug_rWQVPSpK zQj4z1QyfGiKNMa3Oj~w zNx|%-Y9Jy*!tnHe`4O&$^}KrS6SGZ@Ah!wD$Myb#TnPKXP|Rth;C6q{q@UdLz8V zIfs>_o#NA>pQPCmbqdbWlaWiTYpXm+vKNNYB&1Q>mJ)oJ;PhxIA|7Fu(^k~`cScg%VEqNyxJa3l3@g6kr?#Ow16Aj$0iSy(ZI)eWu{cNTv)PXZf zqDhPkQK6F}uSJw;4=MPSa9@h?x+8_O^3-sE2gSqT)D#GCwf>zz>xr5tCglK49eZwu)h0!18Hqp$Jgs#)EA3lvvQb4A6O8(Ne*;wmS%M$q0&{VL; zILZ8h7g(2Ij8V7~O;QXY`)Oo->N4?+P2edRioQ<4D24jOX@u5|6Y4{}DZ#trg%dA$ zfZ@?0iN!z5(h{s%$l};BQ!Df!ASb^FT=dYYS^w+r`sleJZCCat(o;o^F!w}$GJ05g zj>zO;dF71n5n0>>9yUSKv@zy~{w*Ql*_!UEZwgDV2lZ(Rs)^UDC!`^x!`VE7rqbt# zr|NS=xY}%v+_ZCj^`?!kUgY&rD&F#t``ZW}`pEBiG#G?OFrHyo_Q?$7uXLA_?esi; zKo~$$twmekPrzPHKOTF20OZP!J9uoQJe}~DeN2g&)wU%5&S_FX`rA-I7d3^r&H1imL|6W7xE!-re(WLX$=SlrvjlJ zRNQ(|RXQnNv{02nc}4fAvPJ{wKJlH((FrJQ`cv&(i2o&MKfzE|culmM*p@1h(rJNV zqU6$9g&7mrzz35(m7$Up5Ff>c4g8F;cJNSDoU{v8PQaJZ0|d0Vi1)IOtQR=6_BV<@ z`*<(gr&zAa_PS1JsErpm+$jF+vp>1xqW%=7I8~1WKrkRk_DWp3JH}xKbc92kbgVJdoy1)K)X-P)G&*&n!^0Fa z4$}@2w^KZq!sQ-zJWzQaq#eBE+qZi{;c4KABv3`GL4oh(h~dB+4ljiOc#}T>|10o2 zXq2U}e%WDPoS$E*ou6@uC6+E$mfE&AL!ZW#ARjw*Eeq#>S|DmicLiAyMMi0KWvMCS z#R1K9Nw0eF4xiJtqnE_(bub@ehg|)fBf9P{uTHZ(K7FZKei=Bj>Q&Qmll~c0m-F{; zbR0)vpxWb~)X;p$g{i7g=<4J-uBNXw?2u!xY}6@yXby2UINB_8XXf6ZIP@-Tj+{++ z3C=LduJPm)bwCyp8@Sw?OTSBg3(#>Ca4W1uJrfqPh=Q{qdRX9t^eu$p2tWt;FiPl7oJ>&a@V3}tk_dQ562fk64*8@ohg?<6A$LvYkei3S)th+W z33JH9k^2cZhukY{9z@DaWu^S{vOz@pwrw(&JT`rJYWnc0>BF6oyJwMy&<~#NJhb-F zmxh{!$>q`IOfJ;Ka>Pt36J}B=OfJ+UGiD~412DCm&1h=5r^H_(Mb9fa?zVY}{&xGA zEEQo4;I9?nG0q@&do>%;P?L>F-&&iHh-V`CW{m}M5T!}g{NrSN4j0V`bySJW#BfBP z{OPg+#qF}dAeB5Hw<6C$5KV@MftO%z_??kL zs~yx3>3e75YNFce?B-6sUq&Gu1ue)oHj!@?N@wf-iyu6GbnnIXU30o5mMy7F%C)_j z$Xe6rGW3m_@#YN%Al2L(dw%d1uy=1~bNit=95RcB+zxl7uWt@>*5;G#g^%%>HFqR! zKG}Zp@x9N?q3l>ByLM<|z0Ha!W}M;SGb}_@vrFPPSp2}E0E$WS7Qza#^tnBr+i=~d z?Suj^97f~qu{VOb%qkNojemzl0(l}&w%H_=7u1bdus3*`M6>_es>0=k-4FLK(hBPRK&o-Y65St`ifjDs|_~1(m+% z%>$zt9#ES3U@KbXamBr zL9l4R&cod7Pi^$hG$eYeUG~MrfUR8B#r<}#;r&D%(aVlgb0B%?Wq_IBnL4z$Y#?~4 zlM9l2DRLh$73%xZn$l-*x-n6ggSk60DNrkJNzI-|jNg@gk1pVPRGPfvc@(`e z`yHwA1?S>_bn%DIY=vg=!)f$osdo$#o-PjxPnXXXPnSm~PnR3FJbdfsa7}o+d@*t# zjL`RqkNn!L?uv~*9`OivyJu;J$8?$&8vCa{#6tW2$l2U4r|2LVK(@mnWdEaSK`i8_ zyZ#U#c*#~21YVqy$aTerqu~vlBQHI&`cr>A#zP+tw<}%dfSZU&I8yg6yjdWexI+T- zlgwqrGbvfp5et`jMll>AVyQ%!YM&Kj7HH!o)X=W@YMcVK)zY)WY2VPnO_bPJj7w< zd$8qM-iA52gTm0y$R&)%12wp*%_rsu_`u?f-83F}>5+_yZ?WZCXM_QM@BltpYVP@0 zyN{|&5Rz~C#GC$(H+TgPMZ#f+&h*Z!?eWM$7I+J0o*x3!xzYoX2k8J{FE+~H3r6<6 zf{}f!Mldk&vDLwim6cluMF4}(M(+1UdA@J2|Ep`)zO|4>lVpH*yg2s5(etMd-J88z b&cV&KwUut~rt>+8ivIrr1k42?BEtm$S!f>| literal 0 HcmV?d00001 diff --git a/frontend-dist/js/719.b7883017.js.map b/frontend-dist/js/719.b7883017.js.map new file mode 100644 index 00000000..0902c914 --- /dev/null +++ b/frontend-dist/js/719.b7883017.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/719.b7883017.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?3436","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue","webpack://sanyue_imghub/./src/components/icons/ChannelIcon.vue?8c05","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?76ad","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?8a06","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?f721","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue","webpack://sanyue_imghub/./src/components/DateRangeCalendar.vue?7c9a","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?6d2d","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.segment.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.helper.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.options.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.stack.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/simpleArc.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.target.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/filler.drawing.js","webpack://sanyue_imghub/../src/plugins/plugin.filler/index.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?9d4a","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?f46d","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?2ea5","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?6df0","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?d444","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?c551","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, mergeProps as _mergeProps, createStaticVNode as _createStaticVNode } from \"vue\";\nconst _hoisted_1 = {\n key: 0,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = {\n key: 1,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_3 = {\n key: 2,\n class: \"channel-svg-icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"span\", _mergeProps(_ctx.$attrs, {\n class: ['channel-icon-wrapper', `channel-brand-${$props.type}`]\n }), [$props.type === 'telegram' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, [...(_cache[0] || (_cache[0] = [_createElementVNode(\"path\", {\n d: \"M417.28 795.733333 429.226667 615.253333 756.906667 320C771.413333 306.773333 753.92 300.373333 734.72 311.893333L330.24 567.466667 155.306667 512C117.76 501.333333 117.333333 475.306667 163.84 456.533333L845.226667 193.706667C876.373333 179.626667 906.24 201.386667 894.293333 249.173333L778.24 795.733333C770.133333 834.56 746.666667 843.946667 714.24 826.026667L537.6 695.466667 452.693333 777.813333C442.88 787.626667 434.773333 795.733333 417.28 795.733333Z\"\n }, null, -1)]))])) : $props.type === 'huggingface' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_2, [...(_cache[1] || (_cache[1] = [_createStaticVNode(\"\", 9)]))])) : $props.type === 'webdav' ? (_openBlock(), _createElementBlock(\"svg\", _hoisted_3, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"path\", {\n d: \"M446.293333 810.666667C384 898.986667 262.4 921.173333 174.506667 859.733333c-87.466667-61.44-107.946667-183.893333-46.506667-273.066666a195.626667 195.626667 0 0 1 152.746667-84.48l2.133333 61.013333c-38.826667 2.986667-76.373333 23.04-100.693333 58.026667-42.666667 61.44-29.44 144.213333 29.013333 185.6 58.88 40.96 141.226667 25.173333 183.893333-35.84 13.226667-19.2 20.906667-40.106667 23.893334-61.44v-43.093334l238.08-1.706666 2.986666-4.693334c22.613333-39.253333 71.68-52.906667 110.08-30.72a81.066667 81.066667 0 0 1 29.013334 110.933334c-22.613333 38.826667-72.106667 52.48-110.506667 30.293333-17.493333-9.813333-29.866667-25.6-35.413333-43.52l-173.653334 0.853333a211.626667 211.626667 0 0 1-33.28 82.773334m310.613334-304.64c107.946667 13.226667 184.746667 110.08 171.52 216.32-13.226667 106.666667-111.36 182.186667-219.306667 168.96a197.504 197.504 0 0 1-146.346667-94.293334l52.906667-30.72a137.386667 137.386667 0 0 0 98.986667 61.866667c74.666667 8.96 140.8-41.813333 149.76-113.066667 8.96-71.253333-43.946667-136.533333-117.76-145.493333-23.04-2.56-45.226667 0.426667-65.28 7.68l-36.266667 18.773333-110.08-203.52h-9.386667a81.322667 81.322667 0 0 1-78.933333-83.2c1.28-44.373333 39.68-78.933333 84.48-77.226666 44.8 2.56 80.213333 38.826667 78.933333 83.2-0.853333 18.773333-8.106667 35.84-19.626666 49.066666l81.066666 149.76c26.453333-8.533333 55.466667-11.52 85.333334-8.106666M352 389.973333c-42.666667-100.266667 2.56-215.04 101.12-256.853333 98.986667-41.813333 213.333333 5.546667 256 105.813333 25.173333 58.453333 20.053333 122.453333-8.533333 173.653334l-52.906667-30.72c17.92-34.56 20.906667-76.8 3.84-116.48-29.013333-68.266667-106.24-101.12-172.373333-73.386667-66.56 28.16-96.426667 106.666667-67.413334 174.933333 11.946667 28.16 32 49.92 56.32 64.426667l16.64 8.96-130.986666 212.906667c1.28 2.133333 2.986667 4.693333 4.266666 8.106666 20.906667 38.826667 6.4 87.893333-32.853333 108.8-38.826667 20.906667-87.893333 5.546667-109.226667-34.56-20.906667-39.68-6.4-88.746667 32.853334-109.653333 16.64-8.96 34.986667-11.093333 52.48-7.253333l98.56-160.853334c-20.053333-18.346667-37.12-41.386667-47.786667-67.84z\"\n }, null, -1)]))])) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 3,\n icon: $options.fontAwesomeIcon\n }, null, 8, [\"icon\"]))], 16);\n}","export default {\n name: 'ChannelIcon',\n inheritAttrs: false,\n props: {\n type: {\n type: String,\n required: true\n }\n },\n computed: {\n fontAwesomeIcon() {\n const icons = {\n cfr2: ['fab', 'cloudflare'],\n s3: ['fab', 'aws'],\n discord: ['fab', 'discord']\n };\n return icons[this.type] || 'server';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ChannelIcon.vue?vue&type=template&id=ce6ff2ce&scoped=true\"\nimport script from \"./ChannelIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChannelIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ChannelIcon.vue?vue&type=style&index=0&id=ce6ff2ce&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ce6ff2ce\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }]),\n ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t(item.titleKey)), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 6);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\n }\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n },\n measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=5cddfe48&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=5cddfe48&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5cddfe48\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content admin-header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('sysConfig.logout'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=5fbe496c&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=5fbe496c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5fbe496c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: $options.trendDateDialogWidth,\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n disabled: $data.isProcessing,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[9] || (_cache[9] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../../package.json';\nimport { Doughnut, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#2563EB', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 日期选择弹窗宽度保持与项目内其他弹窗一致\n trendDateDialogWidth() {\n return window.innerWidth > 768 ? '420px' : '90%';\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n z: 100,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n },\n // 预计剩余时间\n estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取趋势图表颜色\n getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据 - 使用前端辅助分批恢复流程\n async restoreData(file) {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n },\n // 在新窗口打开文件\n openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=0f8731a4&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=0f8731a4&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0f8731a4\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.channelType ? (_openBlock(), _createBlock(_component_ChannelIcon, {\n key: 0,\n type: option.channelType,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"type\", \"class\"])) : option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: option.icon,\n class: _normalizeClass(['option-icon', option.iconClass])\n }, null, 8, [\"icon\", \"class\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nexport default {\n name: 'CustomSelect',\n components: {\n ChannelIcon\n },\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '', iconClass?: '', channelType?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=8c87e03e&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=8c87e03e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-8c87e03e\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n class: \"channel-type-option\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_42 = [\"innerHTML\"];\nconst _hoisted_43 = {\n class: \"form-warning\"\n};\nconst _hoisted_44 = {\n class: \"quota-label\"\n};\nconst _hoisted_45 = {\n class: \"quota-status\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_ChannelIcon = _resolveComponent(\"ChannelIcon\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_ChannelIcon, {\n type: channelType.value,\n class: \"group-icon\"\n }, null, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", _hoisted_40, [_createVNode(_component_ChannelIcon, {\n type: ch.value,\n class: \"select-option-icon\"\n }, null, 8, [\"type\"]), _createElementVNode(\"span\", null, _toDisplayString(ch.label), 1)])]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_42)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameImmutableTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_44, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n prop: \"name\"\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.channelNameLabel')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.channelNameEditDisabledTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n class: \"inline-warning-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cdnDomain')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.cdnDomainTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.pathStyle')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.pathStyleTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.nitroMember')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.nitroTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.privateRepoTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.publicUrl')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavPublicUrlTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectory')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.webdavCreateDirectoryTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport ChannelIcon from '@/components/icons/ChannelIcon.vue';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n ChannelIcon,\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\n // 渠道类型列表\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }, {\n value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n channelType: ch.value\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const currentIndex = this.currentChannelIndex;\n const originalName = settings.channels[currentIndex]?.name || this.editChannel.name;\n const editedChannel = {\n ...this.editChannel,\n name: originalName\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.warning'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success(this.$t('sysOthers.settingsSaved'));\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=0082a519&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=0082a519&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0082a519\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=9cef95d2&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=9cef95d2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9cef95d2\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"second-title\"\n};\nconst _hoisted_23 = {\n class: \"query-param-list\"\n};\nconst _hoisted_24 = {\n class: \"query-param-list\"\n};\nconst _hoisted_25 = {\n class: \"first-settings\"\n};\nconst _hoisted_26 = {\n class: \"first-title\"\n};\nconst _hoisted_27 = {\n class: \"second-title\"\n};\nconst _hoisted_28 = {\n class: \"second-title\"\n};\nconst _hoisted_29 = {\n class: \"second-title\"\n};\nconst _hoisted_30 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_31 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_32 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_33 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_34 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_35 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_36 = {\n class: \"token-result\"\n};\nconst _hoisted_37 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_38 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_10, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.ipQuery')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.ipQueryTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.ipQuery,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableIpQuery')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.ipQuery.enabled,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.uploadSettings.ipQuery.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.ipQueryChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.ipQuery.channel,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.uploadSettings.ipQuery.channel = $event),\n placeholder: _ctx.$t('sysSecurity.ipQueryChannelPlaceholder')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: _ctx.$t('sysSecurity.customApi'),\n value: \"customApi\"\n }, null, 8, [\"label\"])]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.ipQuery.channel === 'customApi' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.url,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.uploadSettings.ipQuery.customApi.url = $event),\n placeholder: \"https://api.example.com/ip\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.queryParams')\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.params, (param, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"query-param-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: param.key,\n \"onUpdate:modelValue\": $event => param.key = $event,\n placeholder: _ctx.$t('sysSecurity.paramNamePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_input, {\n modelValue: param.value,\n \"onUpdate:modelValue\": $event => param.value = $event,\n placeholder: _ctx.$t('sysSecurity.paramValuePlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryParam(index),\n disabled: $data.uploadSettings.ipQuery.customApi.params.length <= 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryParam\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addQueryParam')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.responseFields')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.responseFieldsTip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.uploadSettings.ipQuery.customApi.responseFields, (field, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"response-field-row\"\n }, [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.ipQuery.customApi.responseFields[index],\n \"onUpdate:modelValue\": $event => $data.uploadSettings.ipQuery.customApi.responseFields[index] = $event,\n placeholder: _ctx.$t('sysSecurity.responseFieldPathPlaceholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"placeholder\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, -1),\n disabled: index === 0\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.moveIpQueryResponseField(index, 1),\n disabled: index === $data.uploadSettings.ipQuery.customApi.responseFields.length - 1\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"]), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n circle: \"\",\n onClick: $event => $options.removeIpQueryResponseField(index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]);\n }), 128)), _createVNode(_component_el_button, {\n type: \"primary\",\n plain: \"\",\n onClick: $options.addIpQueryResponseField\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysSecurity.addResponseField')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"h3\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n rules: $options.accessRules,\n ref: \"accessForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 1), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge'),\n prop: \"userSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_30, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge'),\n prop: \"adminSessionMaxAge\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n max: 3650,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_33, [_createVNode(_component_el_button, {\n onClick: _cache[26] || (_cache[26] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_38, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[37] || (_cache[37] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"p\", _hoisted_37, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[36] || (_cache[36] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {},\n ipQuery: {\n enabled: false,\n channel: 'customApi',\n customApi: {\n url: '',\n params: [{\n key: 'ip',\n value: '{ip}'\n }],\n responseFields: []\n }\n }\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n accessRules() {\n const validateSessionMaxAge = (rule, value, callback) => {\n if (!Number.isInteger(value) || value < 1 || value > 3650) {\n callback(new Error(this.$t('sysSecurity.sessionMaxAgeInvalid')));\n } else {\n callback();\n }\n };\n return {\n userSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }],\n adminSessionMaxAge: [{\n validator: validateSessionMaxAge,\n trigger: 'change'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n normalizeIpQuerySettings(settings = {}) {\n const ipQuery = settings.ipQuery || {};\n const customApi = ipQuery.customApi || {};\n const params = Array.isArray(customApi.params) && customApi.params.length > 0 ? customApi.params.map(param => ({\n key: param?.key || '',\n value: param?.value || ''\n })) : [{\n key: 'ip',\n value: '{ip}'\n }];\n const responseFields = Array.isArray(customApi.responseFields) ? customApi.responseFields.map(field => {\n if (typeof field === 'string') return field;\n return field?.path || '';\n }) : [];\n return {\n ...settings,\n moderate: settings.moderate || {},\n ipQuery: {\n enabled: ipQuery.enabled ?? false,\n channel: ipQuery.channel || 'customApi',\n customApi: {\n url: customApi.url || '',\n params,\n responseFields\n }\n }\n };\n },\n addIpQueryParam() {\n this.uploadSettings.ipQuery.customApi.params.push({\n key: '',\n value: ''\n });\n },\n removeIpQueryParam(index) {\n if (this.uploadSettings.ipQuery.customApi.params.length <= 1) return;\n this.uploadSettings.ipQuery.customApi.params.splice(index, 1);\n },\n addIpQueryResponseField() {\n this.uploadSettings.ipQuery.customApi.responseFields.push('');\n },\n removeIpQueryResponseField(index) {\n this.uploadSettings.ipQuery.customApi.responseFields.splice(index, 1);\n },\n moveIpQueryResponseField(index, direction) {\n const fields = this.uploadSettings.ipQuery.customApi.responseFields;\n const targetIndex = index + direction;\n if (targetIndex < 0 || targetIndex >= fields.length) return;\n const [field] = fields.splice(index, 1);\n fields.splice(targetIndex, 0, field);\n },\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenListFailed'));\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions,\n expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证会话安全策略表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.accessForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 验证会话有效期为 1-3650 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.userSessionMaxAge > 3650 || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge) || this.accessSettings.adminSessionMaxAge > 3650) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = this.normalizeIpQuerySettings(data.upload);\n this.accessSettings = data.access;\n\n // 密码从后端返回为空(安全考虑),记录原始空值\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=06fad51f&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=06fad51f&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-06fad51f\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n key: 5,\n class: \"announcement-refresh-option\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(setting, 'tooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n class: _normalizeClass({\n 'announcement-textarea': setting.id === 'announcement'\n }),\n autosize: {\n minRows: 2,\n maxRows: setting.id === 'announcement' ? 8 : undefined\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder'),\n onMousedown: $event => $options.handleTextareaResizeStart($event, setting),\n onInput: $event => $options.preserveAnnouncementManualHeight(setting)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"class\", \"autosize\", \"disabled\", \"placeholder\", \"onMousedown\", \"onInput\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])), setting.id === 'announcement' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_el_checkbox, {\n modelValue: $data.refreshAnnouncement,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.refreshAnnouncement = $event)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysPage.refreshAnnouncement')), 1)]),\n _: 1\n }, 8, [\"modelValue\"])])) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 即使公告内容未变化,也在本次保存时刷新公告已读状态\n refreshAnnouncement: false,\n // 公告文本域手动拖拽后的高度\n announcementManualHeight: null,\n announcementResizeMouseUpHandler: null,\n announcementHeightFrame: null,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\n handleTextareaResizeStart(event, setting) {\n if (setting.id !== 'announcement') return;\n const textarea = event.target.closest?.('textarea');\n if (!textarea) return;\n if (this.announcementResizeMouseUpHandler) {\n window.removeEventListener('mouseup', this.announcementResizeMouseUpHandler);\n }\n const startHeight = textarea.offsetHeight;\n this.announcementResizeMouseUpHandler = () => {\n const resizedHeight = textarea.offsetHeight;\n if (Math.abs(resizedHeight - startHeight) > 1) {\n this.announcementManualHeight = resizedHeight;\n }\n this.announcementResizeMouseUpHandler = null;\n };\n window.addEventListener('mouseup', this.announcementResizeMouseUpHandler, {\n once: true\n });\n },\n preserveAnnouncementManualHeight(setting) {\n if (setting.id !== 'announcement' || !this.announcementManualHeight) return;\n if (this.announcementHeightFrame) {\n window.cancelAnimationFrame(this.announcementHeightFrame);\n }\n const manualHeight = this.announcementManualHeight;\n this.announcementHeightFrame = window.requestAnimationFrame(() => {\n const textarea = this.$el.querySelector('textarea.announcement-textarea');\n if (textarea) {\n textarea.style.height = `${manualHeight}px`;\n }\n this.announcementHeightFrame = null;\n });\n },\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n ...this.settings,\n refreshAnnouncement: this.refreshAnnouncement\n })\n }).then(() => {\n this.refreshAnnouncement = false;\n this.$message.success(this.$t('sysPage.settingsSaved'));\n });\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n beforeUnmount() {\n if (this.announcementResizeMouseUpHandler) {\n window.removeEventListener('mouseup', this.announcementResizeMouseUpHandler);\n }\n if (this.announcementHeightFrame) {\n window.cancelAnimationFrame(this.announcementHeightFrame);\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=7f157eca&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=7f157eca&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7f157eca\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=69ae97d8&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=69ae97d8&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-69ae97d8\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=5c6339bf&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"@/styles/admin-pagination.css?vue&type=style&index=0&id=5c6339bf&scoped=true&lang=css&external\"\nimport \"./SystemConfig.vue?vue&type=style&index=1&id=5c6339bf&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c6339bf\"]])\n\nexport default __exports__"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","String","Number","toPropertyKey","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","_hoisted_1","key","class","viewBox","xmlns","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","$attrs","type","d","icon","fontAwesomeIcon","name","inheritAttrs","props","required","computed","icons","cfr2","s3","discord","this","__exports__","isCollapse","ref","style","sidebarStyle","menuItems","item","index","activeIndex","onClick","$event","handleSelect","$t","titleKey","args","toggleCollapse","default","Boolean","data","expandedWidth","collapsedWidth","window","innerWidth","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","mounted","addEventListener","beforeDestroy","removeEventListener","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateDialogWidth","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","f","hex","h1","h2","eq","isShort","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","hueValue","rgb2hsl","calln","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","toString","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_ChannelIcon","isOpen","toggleDropdown","displayLabel","selectOption","$slots","channelType","iconClass","ChannelIcon","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","pattern","card","currentTarget","refKey","glowEl","telegram","huggingface","webdav","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","currentIndex","originalName","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","ipQuery","customApi","removeIpQueryParam","addIpQueryParam","responseFields","moveIpQueryResponseField","removeIpQueryResponseField","addIpQueryResponseField","accessSettings","allowedDomains","accessRules","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","validateSessionMaxAge","isInteger","normalizeIpQuerySettings","fields","targetIndex","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","accessForm","results","isValid","every","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","maxRows","onMousedown","handleTextareaResizeStart","preserveAnnouncementManualHeight","refreshAnnouncement","announcementManualHeight","announcementResizeMouseUpHandler","announcementHeightFrame","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","textarea","closest","startHeight","offsetHeight","resizedHeight","once","cancelAnimationFrame","manualHeight","querySelector","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/719.b7883017.js.map.gz b/frontend-dist/js/719.b7883017.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..301b44ee875f687ff3de94781dc3f64237bce3fb GIT binary patch literal 366178 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

B7a$zKr%({qrsQd0+Zg4Ew0wB z5vG;Jxj47FU zL4Xy98zR6f$$mQ!Kauj>-$U;^*Nh}nx)5@g6iK%z`Fy-Vz6R<)uT`4T|r z%tz>D#F+MZH*1(sn}P*p?(T8QK3NDFuu-|xrrne=m@{9Zzsa67S*r~*hXMAy5iOpm zq?7fYtm8;7L(BZY3^326r6;IPSqi}LdbmWwwpW!hlItN7f$46pMQujPJ?P5$D>se^ z?yR)N;t48r6X|wH8199TW{oTLaYfy9t6~J_S^!C$BwW5>E<1H{5nZnM+*FY$Qy;lV zM;Bd5TlL`aCETo?6><}AvhegvQc=1YLa%WB7l-S*GWOY-1{VposnZMa9?~m)LBh0S zv(f=*)97Lg+r&aVB8zx@LdL2-lc4ZffpMXV^}0vvHobV+JB%{E#TwO^$(fXNrX)pO zPOL==NRn%}gJjk06DuGqBx*uAwGpujl3MG_DCHJ*+T6RKyC}Tdg~W}f2RXGjDU9O z*6)FpK;80(RXqr`D5U=0;-wb4fUZey^tMX|M&9K)%;5h#$lDa^+*}RLi!N2ME{|Jh zyMCH6isLt=zGhFGwf97qS4S3Q=)zg2z{(DV=fl+&P&HHD;X@CiT`puid!K2uGKGc* zS8mjUidV0QjD3H>(d7XuF%5kNsDW8+NQYhpc1~w9qPIdMsjQ)J#1hkp3A|-x+UT zdH>^kp_qe94?^#Vf%ez;A36R(g)7}sWKn3uRX^br z5&sa4VCA z_FvPm^INmTk)+}5?rZa3;7Im(SPdrk$Ta6MG=PP(R2w)ZYy9fIwgQwfp@fX629Z40fshII2=V^{w*G)m8s5r=Jxlc}^c@@}^&fNCkU{egO7(7e0v5Ik-$UnJ z#veN&(8#7Y;%o+`hDYeJ1i{0d8C~k}f}sdW2Xo)hZOHM>1LtR0S-_bc5q0DumQ;*$ z=E5d003uF2ciCQUpH942ztkeByy^p{&x%fO=_lr4j=3B>^eWhLK0?4#+T=)+w=a3V z_Ur)&ZA|kchdN4Ze}oFPVeM_3V_*ff!{-&NPdTFtz`Um*0eI285{N-7A*>X8Xavy4 z1?-6VTjo%433I5L|4Va-1$6yZ>&hI;twc36Ze|v`P?&fccY+D$bd#`DEv120s5E)@ zERK}yZ$fXWAe|D+Z-!V3sBA+6*SG^3OzzT-s`N7cm@037I|EgHWF=N$my~_%Xgft=;MTw%4-7 zZF*~H0Oj39&4y1pM+9Epip^VF5ct|w?BR4Lu(#UAuxi{TDj$)~ZEV2mF99P~m?Mp% z-;JL)g5Q_BjoT=T_9m@T;F#<*%hxgOmP(HsIssS5tB`R@T>H{@)GMvS{Gscp*UbxX zal~q5yduO<6&J5g-K7!xo0SFjNCGC!t(#QSyv_qq>d>-6fs3A5SYn`jx=Y4d-;;pL zK;k=3$0dXiSYfgLJ|{dk z!U(5=1op^Ve02T^RJA39d8GbTN>nmC%ojA^2M;MrFUd0e^kPtGG8exFC^Ioiq35lkUUeXDeQ z>-|0=KRdHy-d}SnOTEk2l@t5ry(XBDUQKNM1o6nInH7(uexk!ec9xRER}~G#N_=hZ zxv4Pi&FFxyldGJ!o>kp-k;mRvv>7VATtQ~OE~b;=*XRf>R*KK7tdL?6`+}m zBe>llrH*fCt;KG_=JxG2K~*>tsI3=Bdg?N0M|4$X@G4BO+d3cyNd2JH7z7o}*(YGWRKMIqxG zu$~cX5O%r5`Ef1JBDWZXYt|)rFyB+(vi3kM-9$r!$mM9AyS`N_TWD^S$QIi7=_Z

aKiKvIP9H8i(bo%n>% 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


F0ypD(V(3R0Kx`lg9 z_=J0?3m-#4EzmBlOj_8gvll-3KRt$=<5p;m?2SHW<;(eUEbPC)a^~0*@lh1Qb9}b0 zL1J*J0&8pVM(CY&Era|*t7v}Y;lY7CQZ!x9>q#~7BqfmVm2vi6seJnT+7YCW-_;Vj zO!6_b)o)cYDd^OGf!X|Vk#TBY;=2%L{RWeF zHeAyXyYH%UTPH_ZT#2c8R?;*tbT^;w`84N@gCF{n|6DP5KMe=zLBALVo z$H6Z^U${gODG_QmGoMZGHGISEF&hkSbG(TTXKr({*Ks&%4CE67bGj~h@2-fR0IT|B zNgcB0FXbGwf4};hKvjfzL-N9C)uJV=?GYW5kjM)x8Ps+s<0$#F&B6zV5J{_=8dJv zFE@Q*+eLKfce^D{U=`W778qXSyeYy8EnX|c6510C&C=yz4mq3%KdQ!Fts)F!G?wA z>rB|4px5=%>}$tY2kE2@Xz{JbHcZ7PM%GJO7-JBS<&oAq@xH6JF;SO%D$Y@Wf4?2H z@F&o^onjT4TEm#9FMyA+u>OKto>|0lw~t08Q4Pt}lZ(I1OJD~Za8qv&7XwuuPwZXWEQqKyu&K&@DX2RWyqv+Sc-*u94P%P3D9KnYVQi{o@9}|#-DSREwfvrfyX%8G;`jH9ylzS)!}TW@8k#0dpt}(b zXpF}~6Cep8sKx_I|1=f$uc;I=2_m0&j)I=B2Th=~jHaHeDD#9f6TjIf^-1+nbu-%C z{JavjuI>i^zBiNS@ys1q894Fl;$aZI7v;<2>D`OLvRM1$BPcKR2qw9sd_G=~3G}ka zAQ9_sAqij?EF7ymCu)rN56Q>V?} zh~e@PRL~q*k#{=OL`kNsf8-Qn1E_+DNVZD&;$2u+S{KeA5`L79_>1D#;Dn&67svcU z0d!^TiZ&a242eW^Jbz=qkQHAZ_4S4^hAlNjL#~flBZ2X2&BomNeyOTIKfmqzC%~56 z8}BbVHZ3zJaW)UBfF182gSErJ+d8pQ3{!8z{-XqpJ^T-RkAaG=%=-?z%C@M zR8l1o_-j^BX}STY*5y&u-!!0O8?aB&_GUy$8izOLSjl-SZ1T{e+9dTc@uBU+>)EKw zQ>s<2+OmfIXg2fY)U63VEJ}e~EqmsNkTZ~}2m4=B?!Dfv70jF9h(xh54ti_h_EM5L zMGl}0U`qpi_22qhAJ)ct7W7Y85ugm*%_GGuvsRfm?(GUTixp_k!7qIN;2|?xrG5j; zV~!}k^hIB|OasS7P(J>&)aU%lWWDJrdZ$^y);&0&50JJx%HvI2R9F}FnI#&VB`JGC zSukXdic*%2n&zSpjnA)5cmhUh9n9zVCRhREp({)C)tl2mz?+}+<^ZG}+$)2kP??jw z-Hlf-qtezZ$@_dSrl8jZ&;n0qIfh+__f=0QTfKNB+_0xNigIDK?Pfm zFq!oq##^qGyC{9aalUO-CNE4Yw9~R+AGtU`0dC#6T%T7A?RF;WQkAT}wrd_q8zag> zW-Quru47Q@i-rB^#|xYS^#8wz@=@sA^aJhK0}+aR^?@@Sx%z3Y5M_8dVL#C)R9b=^-Bv}Bmb2mq4qKmp8EBsu>K3(O-WCN3p%r-Z=!G1w ziMSJ11>sKEP3n=vM$^q@jXW*p)K}?cq)?|+JK~^+rPNuAtI|H+K6zWPNg)#t?k!sf zy%Vj>*-Lum*s4U5?7?bQ(5upNHp$&AEj;aFwxViEqdv;O-6t|-5aS=ZV=rZePZB-~ zj=qZL<`d6={$1WBRE#e1|G$C9XrDfq3Err678OF~D868kS%)|F-Sl4c)wVJ5Br&Z$ z#}w{Qa7KBf>ptW7XaW`Dds1+A>~Wtw4%9H3pzv?XElzE(+)$m zB{ouAM2nv=7+i*+`LVays*0$pD)Ed>y2gA|qcv?VOwRFQ%h8?`wPNjApwkV@tj3XQ zh?2EkT7S+j6O`&nwFp{CnXE>Z^Hl*}HrS2fUjMrzV{umB zs!06Nks;{e-TloE5Pp!Tdb@F~6I-E8tf@fQ@$kt2sWe)flH~a_lM?Uq!|+qVdZ^-p zeYgD#9-AJWdU`*`N@ta57nY~S<{6RzVZI()AQM<441(3a%2Dc$c|ATvx)l%Ehh!<} zQ+N5;#I4_f{>ikg61P;4Z!>0-@7KbYdm19iGgAcd9?Dz2hDE$o9*;QU5#;QBIp*te zy36iUxgn8=a~`W(n$)AbmxI#Ci=i=jiti#4zNJ&QIYY#_dWnDSx($EjAV7g+n|v|R zT5j^$Qyn)JIrXA%DatJul-tXK)ES=C|CYM+#?n&w^-(B=rX9TP{u{6-TrTD z%_)XNc<|K=Lg*5S3ymCTTw6Pl4vA%*Dv8&d@>@0DcA(~5>HQ?hvKXRQdR2*`Kv>8u zAT-tAa7wrSop;j075OJP!}xAdHfcwsmd!Wbb70Q9as(`4Av%^chV}I=9DU)PQoEeO zV_XDw`NgVS*V?;B#yT`r`%^gMh7-;r(lb5h|1k+_@u~WiyroNm=S>0lUa2U-d1{F^@hyH>zoKb+3t>%Ug^(Ih@a=HnZ zd2wBO&~>K|d@ur2Y`DF3qJ_|f6+CgTH^7{Wd^Yw1H0#96mJ;Yo;*{cJTf=Qpvh z270^4K!#qeAjW5n^QkZD3>~>aEA{hHPJiVp1Z~yXQugYi0X8&*LE71dmQv5yQ40dw zKwnCL!>)Kj>IWP<1hksRw$LtMCtzHr5sY1n|JQfjXQV;#1AXjVSGx(!s1{jGvZwU* zbpfWiG6LOTRIv%C$Z0z=-=d|&HNv9RWD$~vb*S`CWl61Tb7H!sJ25Mz2yVZB)zH1%9PpovC_OU{e{3cLo8_U-@+%3w&8AEy6F{ zo@&Tk|N5qm+nn(j=eFR0g?jPeb z*b+$pq78f;)G|o$Xq_LTrfyvjT4X+J@(dEHcPf>T4nduv)LN*H5Nl;_6jvjrkBjc; zUZ~O-d^-Ev-VqjlL}{6a-v_>8iz?oc;mjw2d&wQt5#J9EbR$ks8IDEEh!3745oVo> z*eg7b@3J&7szT2+Q2Tw^rP{JdEmTIR52)!H@^l1Sm^AH43~kHe43}odHvkhnKWl$bshD`C>NBles8LR|lY(l$@U$u-`goEbl!MU2MC}lj5)0 zOwH%bt-?u)hTU(b-2K$2pi$E95+_hj$U*f z^9YK$R1 zZMr?C|Lg+wT7v_zUBJI&k&0Vs$$o*4B7SHE8?u`+u+4@8t28v~@W|59_H_!yS38(Xo*|!&k^K-Tu1D9UhPV)doGb^roL~J$eGnd#zzv>| z1BQq;ET4K0Szfk_{;bK5)p$WNB7-NR`f!#}4N`^VSe64c2DJZ}Y8&jAI+hD*xyQ3L zF@0CJ7S*^{X%l#G%GcezRXBC?-8vZ_qqLGBU4c7SpKGx5xXrY>RE>~mOGT56zP*YY zIz0CDp@S~vkLum8vwyW0ZK~Ldf}P}*>|`%$(q0tGdvB|_x|UL_T|}_0PkJY%_EIX8 zQX5-}m4gn||E+!PDBp0BC!DJYh3(WuuB<9`3#mZBx5cKG+k#^GeLUkrb$j9yeoI?I ziRMFMA`7IHC&pd`bm_z@|GR#p3f~I=mS7U&yx9mLJl)4UfgYA7H z@}{{epSbfXUrpUJ2qikcS+H%G$I=#7|Flup>}EW0_0yg83;8%HZjf;a<3G?=M3CI7 zdxa4W{nM5+Q|SlMcZE<7^~*&e?-~+}BwP!8gqi(Y1)bbFvxIN)FKQ0fow0bvdlOLR zfgD^cfJ!-T)edpcMO}`>qm=~I`hpjw0LGBnX`kFh`MZYcB^#y}Hw-KpK7em9vo9PQ zCFZ<4$=M3JzEP{Vhobl|zrhM=8BHuGuA$lOW7Gp=vbCe3HvPXW$2alV^}J`-NJ)}jkt)IR`l;B=Kgk@e0BX+ zZrHwXd*M^$@NOnQaYz`zAKG0iIs{FWD_wH?1%|iB{yzQSi7GTcz0i9M4Vc#ulfFwe z^!XAGjt(`&w{J2?zll32CC1i}9CtZ^p2bK4Iyqo1ki-nHxv;lmAi&)e>1ma$GuDP-18LG zZ`KkqvR8k^Q}&YmG-aomWC!t-B^Z)SC9L(@(LGQA36QCL5pC*%?A)T0i7FHK4hU3&?UFAhFmg!PMy z&1c|x@xb2oC$TPsoGKxs+}VlnlC|~%Nps6Q;(SHzvx3574~`aF=~;MO0tOG8nX*;= z#Xikcfmn@tvK#O)NOb~Dy^B|q1-87!A>4?^ji?IjWD{=!`-?VeE%M?kFP`PNCJE|5 z266gFn0Vehr(o>k2~X^Uj~HKUUUJwb-R=A!uC)nEGcOeuYBmkq;bJ5X6Pcxy+VGWK zI@auvBQL2r?2Se6>c{;trWiGHCgyBlwHpEtDdb85N@4qp6zh>Hju3i@w>Ldezu8E$ zHa2W-(qO|z-zqWnyZ%*h^pAHs_^~OZ|L>o8tyiKPnGGi)To-t1ncZ&K1_bvIfQ&U| zrJEX#!B1aNg*b|i;7JLw<#+;13D@V+jGcxtx99a`3{>H(1@ZvW`SW!RT za5DS%aWPlE=jOh)|K$C&{+$tp+qQKkMrO?LFe|e2iH_aw>R*oFB_;j>s`6hL!K=XB z9;#cWQ+Bi9{g)xSg>mrz&oR3EuZ~fZa1qJxUk#?^?ZMP`t6@Er%qBa5+qVgRL^ef3 zd@&c_-3}IC=l~idTeZB14h+~7_p}_39fJhLQ#GldQvyPw4HT}7r5UuNcdA^i+b9ZE zJaF|JyxFi>ke~;>s>VV?504KBFB{H>adXOzTsuGrF1&agEkS07U)us>rs4Y&a&Rpq zsut_wmTX#cq=X!c{vF6s?5zPkT`$oP?tg1m-R&a2;F(u2r6nVxa%=;iO6nYqy>f9 zai;)e?VUThvwGuBq?RKp)y9MU{Z|b@;m9$d+9M?qlD~7 z`tWeWgY1{>GRAobo^X!eo^He`?{AfN6QzfLTl&j*<;|NU;>MxHOXy@y+Tj#AWbi&x_2i2-#BFd!97}*SKxJy zK49c>?sJPVLFT@asb7~%`Lh=Pp+D>0^@S!}yj9lOBM(Zst^CldeD*rICSm5ggUHMu zE4F*7ZdelNobePc!ppXvU>qc+3ivF$XQ!PWyqF;E=XAP+ z_$PraEw24O$#`a_f`~ZYjph@eU62_7|8CrLyXhMn>ONSL6=jp;=4%2ytkjQ-s8Zf7r`q!8o*3|VT`uN?6;?@M#B zs%|>s%`3aHOJIDrZtRjGy!aF;8f;%#>2>aP16!%m{uBl?f_S%Kuxd?a5#Pz0*NMne zULsF79O-xiaij-2y8k)0dUAP{kXa?CCLdPWI1%Y42cYSMbz%ey+hTqwy@V5`Ep|%e zD*_unI!8S6En49HiQZtVZdrc^OwoG~9GpU-Ru^TLa!yp9nl!L0_|;UATGwVAOyPhLj{-(S0ZiM&B?9tE9tHfpZ(H7N<&%r7F6wDk@?oY}2se%= zWRDs!Q!8M3x+;+20%oEYkpCHOkb5`Sm3ZyEsAH*alM@*JitAZ*#`WO|Hw^duuMzL0 zBs4&FkKY~=@d5tePJffE3?}bnK%yy*{cl`u)MyXM{ozIkh?(Fd2eAoCKdCbg)WBjG zuH}af4>^2^68&5MYe2AOW5{*_RZcK<06elqp80c%O!pF zxi_G7>kqJZ;d7d*VA9f~3bpqvL%W3WAN*RON^p>0C?~O!2y>)WEnew;Sp}p*E!XbXVl%1h0l(AAkVpt!SI~S0;DCF1HbC)e-(d zR+#N!g{1EV{O~}Z8ua1}K}dsL=|wrBXCLH<9IegU*xKQU(#1Gp$SwQw#1V^6aRi(I z#1Z-GHH{!0<%m3G{E*sD!u}JOqWev4B`38W5{gDBqikO9(`{K0-&>g(G5KD)^Gk z{X2L$mxw*<+#+g9G$3aG#DG}+Xh2N;lz^DcHazkVcN6VmLwQB*Un!!53uICaMOJ7w z4U4ry2~1*yrpMy5Zgyc0a%djG5FUj?EYi^S)Bj6n`s&io^xqutSta}E8)CTl%Uz%c zos?JSI4K*y*h$G&Wcp65msCZyy+Q_9wy9pl;Raak49cReLxaCulI% zp=J~ve)4%*w3!=W7B^w1v(~I0b%~=hLs6@$R8g1y7i-}ehplqy=xHbhR>F@EXd34= z>XAH?rv=n4<=4V@=g@)3CwtE_;xSZUKIMG5wkM4NhW}6~vKf?Nk|&gbMfuS$;@<4PmI&-Ls| zJ4qbfUr~%Pl%b)A0!grHf}S}LR{CYVER4Tux3@914_-w{Mj?lweM%8>`4J?N7%UcN!`w3M9s zs~5VWjC6aSMKHtmXwU72BcBTbae4^ck@ssVt86alfxaJNC*Tw7iOqA~T8tIlbC9@| zvaNyWgafD+J0BFSF;x-t>`9(mGuN?aq76qf!1PXi8P0e@GagEpr<}S)jih8idySH3 zSk^Q2Po3dJ&v3gl!wl`<$Mk_2(g#IfPHBpM;uI0$d~D8fn7pbfsT-ZqqIznki4k05 zG&ZD#%dfek7{y)G`!rJ_E=@HIQxNR_6XQV5WRHxR7Zlgr4CvLolz}EnwHXC0z_i2y z>T2XKv`X?D6x>^zL?S|n)1`YN1V;DmkPKw4cu^uiW0#jevY?ei>LBU8cC=}ptGE$2 z+CBWHRf`aKDRaA6S3e8HI z9NyGsrUBic?NT*WVrVu3V8*?(;K3r^)`WT*lL}Pg`Rg&2=Cu%sT6B0w<-Wrnk10Kj zK$|u}?li-x&p0LcG^(~^RK+wrf}+LxH8gB(igAjR6As$H;S>t4lHjHq=pZ(q$=nzc z=ER}-R7}`e^L>-P!)bc;0H`;sS`@5&&`LZ>sM3H8c8zgc>^tb%cy*_7(KMh2jV&gy zvFmqqK|p<>%Y-4KE`#u6JL%35wEgG{8GN=Ak{WKJW`LL0AjJG^U^Mt2s~@>YXn zh_9?@g3?)Rk)oxHjH6yAGP6 zeg`1gU^I)Bf!Q{7iD&vh$g)HK7lWV97KEBazO04ho}Or>bGtz;^x#CUbK$(NnD<5) zLE)EE>qairSJYK^g5DC9W$Oba zAVH3`2My}u*dx5X9v$?Jz~XcIZAQNDMPx`yiiTBN6^%u=hG84_YN0E`WQiMX2HHlrC0lWBy{tH>$iDDmOzL`MM2ZKU`DB&A$uBR%sE&( zkL!&HtEHj}FjgB``s%Pv`k%{LIz2~QXzZ6zh`}NdFhxvNiNi1RHp6=&%dIeG>8o`+ z`lF)W(!slQi&{c0ddL$ByKarzUSyOx3T4UCoVo+{2xKVsX2OD?g1-&Hj6MhHnk~bj zv08Gck~F>VVM~a^!nJfn1^Y8vK{L zEIm`9FurxjeM`ypi%o?Fj`>=qKU6AIb0k&!nHmA*1e)^0BKD=!Lv^buyAQ{UOB>lh~IwSoBEBDJaElgf46|jG+B$9PyC-6dv)U zeIkdW>+QJ|eQ{1=dU9Kc#~nLtOjsjjA(N+{QQjj!Ya#nSU@!uy|vc#m9%+$tYE zonjQV0Q;2kG(xo~^2i+5zDWI?Yfb>I(qhn9%8mAr*SKn$oAk1| z{LWeJE%tzm_8jS7!1H<_sclhvfYeqC*@>}){S`i=Z=qJW(R~G4Ier+@phkU!2YaY2 z$#MHYxJPLDr3pSbP5&izqV}vA9IHzTScr;y?cd&$F-s=LIc z(zd+vIMI^Bjp-pb?79njNCHR_etJn>LkEi*FtMGFb8F7vJ6{=L9R@YiseOzQjy^bA zrv5kt(rj21rF5S`cBM^|>ly(o5m-iGOIzp0u%#!J8pVp)1HkW`QOk>VT5sr>^MX@( zW;o)3V2E^AokrdVOmqPm`Rh9+$j9z)BgsOTfX zF6Pi5qZk6xd<0<9?!u_aoHNQwB?4E4Uml7j{;Wk;VSm~Txy7EI#~xR#kbASkJyq9| znk-e~FMxjvrQNHlcNGpMxWODvr%QD-TCkyy(;@&>+b1g|*V688g<(Ow5poU4FOUPY zHxybEic79&J6TT*%vTR##!}Z5+D=~+$?MwZ2b}EqHeOt{Md|0` zy7?%jRbRHgpxMKFJKM$&66Q14p-yN zF4PjEEDltr9%ck6iu064I6{)%GXnG3P_~nD72gCKu@^=>>J;(7pM2y*)ss*y0j3OG z0IbLUmeUk4OQA(D#F(T&CM=*UVb_a=3NX?wJI5nzYm~U|(u7p1KP4csJc{coX;}!J z>Z+YYZ)M3e7ch_$@HyXPEE3Gbh-IXxTbI_*-gkU!?EVs`IBNcY&qr z%4zUEZPib;*;H<8upw}a$x76in#*)CT9Ki&rNj0Nsp0E0LTmN!K7YDLj>!?7Zb8|~ zR+X}pX*bAIFj?DBuK(EP$ z4>+)h2?GRhHA3zEhX@jx8aj|^aR&#?&V65yme9->syb&}I610^z?2W{a>sweP2m1E ze}|A(E#FRL>p9jKs;TU`PK;j=oRjkbqi_3xvFhiX@y$mP8o-hnzML(9x6}56q$u7h zj1GD-1BYCM(bo#w6(I|g!S|mMCCn-+>s^Pib&FLk+;{%x_ubqO--|zT+ogJrRyFmu zqZ6W6t(>s$8d2bag%{10)o)))w+idxxvI+D=ng1xJ;-H&aW z)!HlxD#?F)_3j*|H#iS<`}F>;n#ZkL&|4MFbC90N=)qM{4xMbZM zKE$R^mRVm;h)!&o&1s6Q1y9xI;D1J!FA-o2guX{;w|ohUt{WCpy66UJdScD^a}Pqb zr!MV^iAzg0btBS)a1r8O7%{{Ruy$5Ma+Zvw7k#dbxtp7z4(u(WKLe0mR%Y4lKLk|b z7s_CD=~%qxfOf#kTOtV-Ykn2fgea~AJ#Y=8T_O;+Qdvd_=1-^v?tiuzNF;7eYwSmq zrGkW@h6qE^FjpDUVldtHK5p5#|%za z1))k40eJaHD(A2&x(Xg=ERR@&*iebqB9|4VQL?t6r4=5?Sk+~wLf(}KxYI;R-{{a&O z0^r9nr<6TFRnEK?-ou?~AA`Ipa9=O_?7qf$Z!6OYGlsE^4I6D=F7{K>#)`8joc4QXLH=38YQkh@1W|{3muT{FD8H=z3G`RhVtrl^#!TL^VvV3Q4zR z(s9o5UrD;jiKN^6k9Mi99g}K{WUAqg8)VoJnK8>z$3mKmda~M4wuMaCufc4=_Mo%6 zgE&*crYv9*ZlG(uY8?#Xt90O5ltIwhV4rT)Q(N6+L8m4(sQJ&3%d3Ve0B~Pu91$aX z0`6V$y=#51jkRJgLX4&U4ZhbB_S4SiC<3|U+x(#lIy_fY{HpmkTN%nz+oY_G7k1aH zKxeI&d*Lw6VFz!k3ujR~@om&Zd8{}*op~m9rEpI03D9E~n9sLE30LlrLIrRSp7PtL zkZHSf7eU{?!3UQ|Ke(6n>IB-?_tPF3bTd3c?gj?n-s3}U9-+-WG1lg+M}YayeP*)r z%(+x_tI71y@7xX*;cbw6VfpJmNY#69XAz~INc(o;BfCPRjgSPvu`wa}hsGX=zr99_ z3XPVZp|#_Hpw1C10-L4KpFF}^e760<0D*<&9}DTm0t6l-*ZBh#bLH4u&ZGg?*9P9I zeO{rTl%Nf)kGvI3G>H4%YTGQdkSqAs(y4FlDgZtRPm>8I^Vx&DU3bV>yF<`JuWqO3 z`Rg;>PPze|aHY0s!AWI%fj1Ef(-vp>7872(yaOb&r%*BcLY0^CIZ>C5x*Bg~SUOA9 z&t0jjYXsvuY4||ChFZl8QUPlJJ^Z(7syh)>J93H7Bbe*D__8(bglQY?oqx$ulhyE% zju0tH_0yDBS{;s2<=(JOPC64}c%#E8$nL19%9s=qLU5y@g#E33N=bd7mY-vAn%ZO8 z8^xYcp5&M2X?!`Lfc=ATb)ugvNnKM3g~his^7K@sHojOlYLN)`mNFwA!ZIi>ljv#b-?gQddN2vMOA)eALgkE?M zWqilBW>kIZ#A!&eLqUW#(+dq{$X-_nP<+8OX`M72^d=2JiLix{NkZ4wNNbzJBt%Od zTw^frhk(y0;gyT0>P(Rdj_8rtvMt0jt>mnYFP}`XVk2!Qa}gk?W8ps|T>Cgc^{u%> z@X!P$CFDIIH#l;jU7>!y1NvQ#=0-g}so`m7Id(9kd_Z}ocrzs}=~aJzrjA8p&fV70 zbWgdAogv86$q0Q^&MjIaze>xiC;5Ucd}+LcT6*jdNx{AUjte-VR;KvmvrwC$Yr>CeWZE|6$3bJ=>)@BBAtM`*UvnFXmS?bk)_q5#u~Lcs z?SD#DxTe~(_taF+5kv%d*M4=!PMEy5xe9MeUxfppf{!-x&5va@OzQ8q!fgFCg03~Y zIES0<6`dT8aJ~(3xLjzn9pjf3#8$EGKY)3)Wu)3qY>fjw|AXLtoGTB-)<@iqsBL}yA6fNd`0Dvn5%!jwSH?M?H% zyAwJ~)8ha(00_s0blq|ABm+9=QqFOiKmki*#i>O2+@KnHu0+pGU89r(^_mU2gKdu| zKA{AthpF**lj|p$Y`A+~))Rd2iHT6;>?2xM>;tcQD)u9+9sT4<{)xZWVc-;-k?go$ zekAi#N*Ct#K|>Nu^(<>|l;COivHOSewYF8#+e!2A3 z-6>t*G2{*PQTDqlH>JVf{-CAX)7rUb;3|GitmJ+ zahZ?aS+Hv6uWILyjHCz={xO$yR^T5f^i_%ez#=r|$!T<4Gx`&~V3=QPJU1vZR09?s z$e>R^U+!q;x>!sdy4cW|JAt{;XOm|@S@TqNW@O&5Rfa0*Tu&Wz(l*uHRP4xeh!`P@ zT-(@TyyNOtC7L_%QgXtQqU+lAAU!2Cseohdso2D!_B^5bs>7U#6MkV(M@mC?ok5qh z$Z?%A%O_yoL9sR2h3?czG)q$`_8+KIJwGM7a!gv+ptd9}(nam56TEdyHRuD%bPFhy z!uluPx@{6zt4y8%G8X--9-9U8apXI${?1#%LZg9^Xk|@! zwCOzKmjqidQwR%VRIi>d)WX95#cjAK-_7YASXom7kZ*QKJo3)ii&-{tsSE>qe5W1P zHZ~*njiOZ<@w3_RSu|CS$tpd^XBx?KT%>SG2$5h#0cP3@gWEB0YWCSorj#_4j}Cu6 zqs!T)B0wVE^F8v8XlKJoPm6~hVsol=t$Y)bzjTe0rNg2#pK9Tfw7uC8#l;hb<=ueB z;3S6*tVD|!v5`#K6Wl$O`hic7?w`RdkIvv0PpyaK{l#rLXLxVhMJ8_dxypXL>w$X@ z{&y1Dk@UVSLQA~Rm)pY`dhjVFv*Qw)aJyWnkzbNL08~J$zxXAT!odP=rVd+x721jI zvK#%*hR{vz;RNmDw{-Lcxv2)Zp}Y?BIqCTjA3kKBf8+!L&QYDQ7KP3;=2|MlQV0?=ky@p8sBz_v1O63|tcEQ$M=Nih3CWin|8I$6tQ) z5pU4?F@e5j>&S$HYBTgds`$_V4p0F&CKC!p&p@0uN7rd624d` zGh?7O`n9J*U&fC_?dzE>%H3_WC0|W$MzLkLh#8}gI|_r=K$B;)P@z`p-4U4BC;g z0!G%4br^0`w;GWgOLa3InV4xhP&!>t4+eedBWiV+wCq!AJ4AEZR=3TFb$fK|#1M5v z_JvQSN6wjNekeb-!I@tdYJ&`xl~nEB91^h~D>F1^M&T*{LOpqD0)8#sil^Y1K5ud} zcHnIz8ElKe^xQ#*uIN&24~M^naRxpERRxfs_U*q6d3q*X0Jx&Ho>HzF&tJW22OxTi zD_RqSVyynmF`wwnJoJwLz!^@b`#1h_WQ06Q)e84tOh>~zP%HeS+YeD=NyW2z`)4#a z-LBcH7mcNuD@q;uXy4qP5S55ND_YzarPd!gi4l|urXb!Mf{c%8`)OrId@~+Z&+*3b zcFA^vrhdy9=9JsCouk%!mm@{0Opr=Wr34G3zUJxj z#<;shtz%S`x+*5EM#K^e{S&SclUO)9CNc9OBf000#9W>glNj*`Vc@#F#j8~s#&!ua zzPMc(Y{|Az*J9sU`bHb;9WWlnzN2NPP81%=M@-GI0IvCjc{?1piYU~x8KMU~R=g-1 z=48z6*NG1%uvY*RY}a6UnM{qnx>ot29ovuNOqkWTN0h}jb_!Tj9f;eO>WOjNnKI+H zt&hfSmuB2Hb0BW}Ce-Z#@yRis8J}Z*vard0AZ%d&fOsbE<{hc zm;H>I>?QJRKTcqcJz_i;5#!INi1E`XJC+D?7DUEp&Kab|hsEQVlH>f^T818uP)k$; zxfv(Ze0VC&V@!pBN^QhGFsQfKcL;7G)O)xb^{~@JNWJk{)N={HZ%Wkj&Zl1Y*H8~K zJ-#Es>YpT6C&FtiW>2IR+J%qlDYM$AckwPwFtE`_cl*Ab-A~@x&Y!rme?*AAIEytA zv-r`U93l1vx39*Jx2oJ9_>7}4geci_6fWu~q%gHElESq7*+=06Cy~>#rq9|#4_H0j zo8idTdzW=|>asS3s_qJsy{x{9u=?BOSiJ|^G9-#OJH>>LJS<)o#O(Ql#>g*{wm;>p zdW;-Zz4}wp0Tt+lW1@jiJmbQ>Jo{p^AGdcuc2KrLc5W? z9PwVzgBNO&XHoBkYyZYXzn*h8{Wky3q6?lylc*19oV?_3k+W!g){0~1>+^Jm_SCi( zUpVlUzV@phI%hT~D6FSVkorkL$g7P&?|kSMt7lBqd+824-g4oA)XgnkeWoQ2CW&s^fkTUdLoGy>FRz%Yk{a?(;n9V6R6)-h6uQ19h()cYPe8T_+|_Z=CSD=xF=({A)X z;ublHSP{3#_Gh?7E~y=52rBbHu~D*iH2)j5qgR4p;bmQ)wFh4Dq@$E_=#_qoc62=M z9^^%#_x^+BJe*wKWUoV?a7D7RB9laZCQ;-szI;OD&(9BOp0*FaMPdxwvli?ddSJ5J zm-`DmW~W=ooy(D^&*h5Rt9X`z(kFyypH!2@Z?%zshZHOPjZ*9>a*}7y+7wUJZe?#DyniZhTAu{u3VI8giCXHQ#5`}V=+ zC&h6J7i0X1jCkC)XE8oLEZ(w7E_cXb3b2!uZn$7SM?bR#CeY>cP)?6~oopVd zzfiHDYRPc%t+N)NYb}SeL>}byKM(Rh5Ar_`@?Y*jPP_8&$(a7B2s;JHJ&(^ z7}_cR_z@AEN@D#gsDZ$0*D=ba*9_wSKy`)C0U2JLEmY551^upGsk&1?v*gX&T_58v~Qgl{RgY$a(IPaJ}w7V&E2|dGN80%$G86eRQ;MT8P_m^ysa|W4LL78m> z+e2TCfB7JHHd>F=mbAC0P+sM)j^zFlChZQ-^p$~{V;kG&>V)mHI^R~tN}22=PV}rw zgbRW5Fk2n5Za}RXV#*lUb%x=cn$K)9JBB#7$3?)yHRk4sTv= zC4b;Tat7ul7xJ9xY(BBown_tjs7lSd%+}9+Vm#ji#JX&)H~uB7eP}oo_L#=jcY{Y- z?7-(>YD1_+4RS&1?RIt+w@**t zc6k2|yRQ=2eSGyPc3*yC{+=?7tnKe-nklu&%g-(@eI65*W0bfYl|MyC7^BxI|tB` z!2h?$u{&A-JQqNtESv!G>|;RXjII~&V`la{TOe8OT_jiN^t9fyPa#%$z%iVhe7R|c zFdd$=4+M>qs`PrRipnzdMhp)vAG>j30HgIJLF7ZDymU73M2jXkp-l)h%XkTd54I{X z?v2vSz*P&7n{98g+Y9T3n?Fo-mpOupWKx5gXh>J+GBc<6A4Sx|CAE4$y ze_gvWHd{#TLe+)9BKsYMXU2n83!r-#4$3c12?x!9(JN+qfq18geRsNV@Kv-+E$WoSvnGiG5~Ff%YB-uP+xR)@1u^ngnnG>C%9o|cCaeLBcMS)ZGMvN|Uwv)*Sz{-(Mx zO@u6j07D9%Ru>j|IH(KDYKEa+10h>Mk3MA~6yZ)PXC06Fq!arc64f^L9|@SFr?#zP zpYk2RoRg@B4+nrb>pzxypRWwlbE(J(vz=BN7I`?R4a@#C$eiP0GtS zTu$WCqF-8+M%Ng);dkDlf+~@u)*j=`NPRE{dd%4{_}%%9F``m}V5Al(QHW*Wo-SsiF9$4F+GDk7ClwYgBgoF9N>(V{#YC6@;GCG4J~zx?sI^~qEClN zV*}@RQt;oIbfWFDjh;#4v(|ho1FSJTlRhn2et9+7KNIes3HQ&0`@>AQ)3Y%b*Z+Lk zzfBXlIL4WtniusT`e#wktC}ch`G3Cb-|ox)hjaEprDR%-#1z+O?SpC6L^@lah7ojL zah4W{Tjk57H-q`kcOOxWolnyVd zbogh94=;i@mi^zM$}~!q^;uMzM)1b6wf}Gav%d;&?9$l|2V**aF5Xz6HAP+T+p`#d z9Kjna{lgpkyYz})EN)<(=X8qUjrE*A3vcY7hxng|_@9UPkMR&El&5TKpT#g^?Fp~K zKivkE9F(w=c5~7}Oi}wkrTnrIz-IPvRijZVp}x**K%GYz%+nA{OrHO%3;R0^QDmuD z#ny#B_7^~?!lu2Buzz%G`h3HWtNZklE42WSh+7_G-+4m5;tMU~$G(jJ+Aw}?#(#V; zeteAo_-6e09{;fudD6KrmTEEDsU9l5f64e~shTbv!J%hKsenJ8vP(V}LE9K@g8~Hm zn;jHoeXE66osb=@lU`E~NvD34PI{z)fM2AFjb-JeXPR8e2IZ~k6P|FsRqU|fZBs>z zx*>=G<;piMI{VLth6Z<$VyU^*HAl8k3z?VvVSq7`Z~DUm^cDNNuR?Nh({ie1tcU+Q zDKaRSE$sV|&m#nZt8^`;x+5SsxNLu2%kY*>D4(CQl0N1L^(`lZ*4uXsw&Do&sv>~S zETwIsp8T*t?@P&7dO+%awhpvWbsvCSIIk7s!zvuV3g=Y}DjLC}UJu^m6^?W#bXDrK7(-w)XUR_C5c|iC&fAG|Hp*Zv(YaK3HQY=Rp9JQtwJ*-uu! z8heRz-b>m--J#r@wd2org#DCTtJs+Y&W6K7=Y@tYh~;%5TyRm*Nk>wv)RUJ1FUoSHM8B*-TX(WoZ70G^jUvoUXu;;zkbbK>F8+Y@z*#% zXv24e5UXr_$4?i|zs>q@v;Nzxf6QiegkAHqRsAlTO8P}{gl6AFT7(zdDp>g6m%)f4 zy*LSsQNgeIE;&RBT^nqQ*Xl=yEwLV>7H=)cV?R3frBc$eEo166LX z@SYXBX>e;ln55e=)8Cvns0(`YwjTP`Ge3m$}S zS+2%1>{;&k1b5KPjp)M|!IOoN+`T1(AkKWz0~=grmq_{w7_#0c?m8t43g? zh6I5mIRFiHXe5@qGmU(3~TN#KZPBqAK=AsEai! z8~kVkKV%QkgY&?a54piZ+guM)p`#NZIF#4hIT3SXZv49pLl-I|!EzD0ZLHKav% zO0?)rnHHf8(FL$gI!n-30)k+ZC%EHn9yx7m)7wB5&(PaCl@-UD34jCbqb%BdjUHZ7 zRY5LO^7Soo6TJ4xg|@^pi?O0xMPo|9{b(OdrZu3{8`e@7H^3z6x7tFbnFjhWk;1Wf zSD%(Bk6B{IHs^n9;sWUm4@WGwyBLHiu^mH4KJl1GEZW8>mAsc0>&= zCCBIKqnS3t_xGin1ItTMb1?z`c6e2`Y@dhBVB;35v)0udGUQ~bLmRb&SKYR;(0zni zD$tmpkfcjl>XH;$q5H5s+u-JPVSC#(fjS0!k5s!%5B0oT3j5UQH*_8b24`2%R5-h+ zIm7pPlGZBa5$ev2qai9QX`9bz(}+34gsD6~0a!B#Zj&V&vN4!?9I#D=Gs&`2AAYric;eyzh5Ax zf9=J5T!#ZarbBm0Fmk=66S>Vof8N-(Dz(Vn-EQ%}`N1!P%xxaJH$4v#t8e{A+fye@z|tuc=G;*KA>X zyo~RHLkf1D*CN=#m~hFrfmD6R+qUxvU%dr-?!wegTo61qi8|12uE&(li;<4&I=-o6 ztgE^o>|N)UP@<0ierk1plPmSlS!%c<7C0f>okeugJ~<8BG`#ezM!GehYc@wZzJ<#< z7|MgodDZ&@zdsJB?^Z-DbU>Nt`^XO(AC7$NI4%4KbtRT1Z`jNVv^yNi+d7Y7=8l(# zx!7BfvsF5<8-*b$yhyorX&6ysa#A!{abJ;c{x-cO;O85BDmx@iane_YM-}8?3y*e4 z>!{*L%1Z~868yBsBK_dU3sN{e%%!Mr=;M73fK1CYyVSg94yNbQXMq#a(kCHj5?MTE zaTV1AxAT7Oar6 z~-IWw^=xHOd|M|I!*i1qSao+9)1FGXRmoMprkRD)QCSy z7H0|v@}QNk{!$Ch!7}>3i3B@yfxEwpv-q~X2}OW@!9fu)QXm32CuI*U(l(OTk4*=A z1#cyv0^=AhhQTI;U#GEONBk?F6}{N2snuv+PQSo^Md1c1Fhjj_8t9$+ZtluBU=PSX zhHVRHi!%~_!xU;$m+3UBVamN+FrB-kl6U#U>M_&KCuD@*8%pN{jV?Poj~ro3c6EF) zkFb355mux$p`FudItdk2#EVoJw9?+U%b1=jXOe!1oF6&-+`H=&E@vmAfHRQb)}91M zUmaA7e8eD7cMKZX9Qklm+IPrtsDD^8yNqhk1Sz~G3XEHOco|`B-xgKi;OPZ8xXg!V z8ZkrBSESZ5g`T6gaTUKhLH=>osH(35Y@@ILULabAPb@NRnnbM3Lt0Z4EQ-Zfl%|wn zkk}w_{COg?fX<50y5cP#u_E2mZNi13yV~Uf1#$h!31|Hh$wVRKiR&=uJF#ei81XG( z+?l15TU!nF-(KuFO#j>rHTLZy`ZKu5vT())rJ%V2=`_H5H#qOnxOzZ0Q?4qfBZ|m4 zO>yS&BJi}@J;kCkP@PC{QE;I&CkOEWE11%fvK|{b}z+9O2NypNPO`CbG7jNty^@h zQ7nQpTixnW&KG3sjWyIfBt8W;K@&Y@kZDFLd%DIMb1 zmM=LLZ!T&I7;B>Owt(8`7F0n#XQQHc!!}WbJ3_o-PR@wDsnyV}IkIs0?*ke=h6|c+ z_(`8)f}5#EI_DXBYDFV{UdKkR@&2J#F%GVtEs}RXL(>>yJws3F%ka-5@W=vn!u!zM zHlcC7xb)4Z3lcS}0_b~ZNa4r)mjH6Sy}9C@9{8hBzCdRvG>p~v%hIT2(g?kw26NG; zN3v8lnd@h*kGe;d131H;N@J1KJt{INEqRfk#s{cSy0v2d7_Udd*dM6a;GKaf(IAz)xm?l-IraCPkjkFUPkMh!2H}Sl z3GPpyr%_qoIr%6B1zmZ!Cuj^a1##xr$enJ9W}y!?Lxr6v)ZH7)iA~O`y0Bg2+!V=Y z3h73IHimxf@y|hVPH@D&?mb{3bpl2s7NpVIES^VqL6R-$YnxfkSc)zP9aR~SmbDz< zUV0WxeT?uA>9>3iBYET6SekmL7-35XpvQ)iJGZ)otih$`q!>4-or6|Ew=(ZJ@#`Qx zlP?F^sACMVgOgdg7!FofDcxJfib$dkk>{wpx-IGhspCGRHjDR?ISSj8JO_^wCuYH4 zuu5H;kr&L!xNgoUdO2xE6?OR;^?8$2%u(25Hs%{#xjG5{f;ES=eT0)v58b$K&M100 zX+~>aqdw&>KMeS^fWI+Cq9q(xX_p%tB4VfkHudnR*~OfUwjdW>ec#wY?)#k{6f|dt zCFCwD_&1n(KhXMC=52J@oKfUz(u8_8O{i$qsQ8MP2>!;gHH9-(+A}u_LbJVjbadD< z023c971E7xmR9f7eD9lL|Jp6ia z4O$rJC?CLMR{f@UWhCr$gu2ULg|XhuUFfyxQF;*a zjJm0Y6-bk9SaE&rvIZNy4XSIfqRx)xV8gS~nwHAOh&30CV(x2iZiI%zItZ=~U=g0#I1y3kZ>VeW8sH>S)P z3e^Bx*gyWOtF*lS+-{$%gx$Wb5>4Q)E8{x%{2C@-eowsGjoq9w=nXS}BtK-G3;1r~ zSIp17H6BXKpYXCm@-+JTG8XQ+`tm0E^8BpJ{Y$*$yvty1BwQXQ-~FC=wJXoLJUQ#~ zPaH`1tS`ndAL6an4sY>8X_>sx7k$~D=|#T5!JC$Lut0tD-j{#qNZ(8}7y>vNW$KD+ z)SIY5VMTdHQd+pi1!;oWLU?IWWnfSpwm7S{0q&wX`A|^Usgm^S+}I7B^z*v;UB(ky z;g4%M9P0F33|*_ee?&ge$5(b0X^?myQd6a+*LTd3HFzo%`D{^@F;LpTJO@_jcL|B_JLmvKItdqY;!LmT%{1$dkwXT6$fx=m?n?#0B52ewlb9)kH`7tq( zS)!+>5l+bV>c9;f8FbS0{B!$ClK&KV+;#Rq`tV|e#su!57BH?jjLZ?(ELo+s+!vv4 zW+fTx>yWp0OqkF_Xs*_QvK=_2ye2||u;kxa9W>>JefNHs=$wPQ-LIF;70F z%4>@Dxbo@fDMg?9a^#fiInh(<@Y+RBsnR<6i~CQh(xFqT$OmL_O7%`6Ek6c9!4-r3 zMo+2Knqa#5l&btso>Kh{`H5Br;n&yU7TTV6N@XIaRR40P6!AtIi*19w<9%T7v>BLk zL5p4a(@&{T&KL|9JFrFyyZlCQ1}C9!&yZ8|W{7b&Xqg?q=eL1N@+N(A$Y&a*?kHp& z0I#&IzN3AU>Xy{HoAY1`ABBClWQfv^P)pgH z-zpm?h6z%wEzlh;mnQzw-!BP#M^2x;`aU#XFfXOa3!Mt=)`Hvys$`UaJ?8iADhS9{(0m+ zH4g{8$sGz|1;BEMaLE2xj$;QCT2jUv+1LJc$cKYQm?S^0_Na=x(cfYo{}-ztI{t5_ z?Z7v6m>JEDPiZUjjl+OkRoyW~RchOaQiQRE2cfRT$B6y>Q`y`rQnY2c;Yt^RJqQS# zV*(>?SlwEj$1&-yv$xeiP%EW+@-c=jcY7}5zoZtnvEUA4PL(mLv#z4sth3or1Zf(Z zV{uJEh-?o<=A7UZVPsy-mocdS_05UAaqMfo0SjoL>{X><5H>^sc@gTXxCF^B$STJs z##$6i>pFcIhQZNi#*W6D4DyYGsemjymuFnc0HITO;Z$0I%U9h_+B?TE;auby^mRjE zD8502CWb!IZb{i^>ZU8nD96gG?bl6T$QHd0hwWAO4tsGMu^P8ks&ILRtpF@T=M<_a80fC{jJHXHfmFT2*5H2+2rX7aD{+tJ-e8T+a z(fNCa=I{5N$oxy~v!_q55DyhB=pH*q;P4NReHI|eL6KfAoF(8qAouT z=pP*vE@rr<-u4u*=!92@m0Y0zM!8q#@O0dqc7*7ohIN>TrY|Ex#QgOML|k2%hyc19 z(s1zs8X|1(o4=+eGQqyUJ^U?^p1r~O{)s*E3ZXVew2h^!8> zWmQKoyUy8bY`jP`ODU{Q%6>-9exQ}=5yG77wqo~w(mcoAYKUh#8c`CEmB%{m>6e|H z7syG405L541oN4{jF~q_=)sC}0j=Fs>9rfKku*&x`>GpZnk89>o4on6Xf7$CTYaDv zDTmt`!UySZveVd!56LUytb-vHqC=veMZ2J=igVwP=I0E_bj42{?TQDZd2<)S87&NC zCM&@oFx%>Cx)SLHX_blu+Yu*% zrOXI~Ic=A+wzHg)y`{SJ0q2RV&m1IpK}|Qc-W`4Ubx)w~BQAssH;+mYKE(mkKDmEd z|F@g=hucYAP=Yx@QwyP7>LJrAZLsp)I!l1fPZD4U4j;z8pe^XyyxpB+M~(TI=wOVX zw^y?$eq6e2s;5ho)s~VCHyA&6_|{UD#0psqU(<@JY=N^n=P}m%5rOfhO*T_f4D63j zft?P@;we0&kp~{O$JS*#V+1i+)7po`V_$x3wjVtXHd_pZi5%vYU_I7H*65H_r~IW) z$@2`YkCx}#pC!-Pu?kLQ=LC6<{c00BOHGwH=omlI?He)|qb$Sw8o!Q|P$Q!01&Q8jJKHM-yo(gcycE}kFG^JOydZ5F`jWPxHBHoI zGNl7xXZSec;MHkzAJe8E+g@ZfAhmODCR8srr>p}%CRSMUKpo8~S7gxM>Gb}CQn1#P zyEM!o(jcYQeIY!R1HL|J*I> zf6qU=s<8d}LKm8h=#;j&RC&$oPbY9q^jXoOPC(<@2VBG~tX^>Z^LNh7VZjBKlio=7j$trw_FT?3^l3YfEd*>0&G4F(o z(lXMHt1k0Njt;3h)G9QEy3ZxC%#aqkUOfJFi0Db&IYJH0iN3#2{tc# zDX5pAC&m6uk%+72C1+@=*_csK&S;u*Y+3%sNnq>MgfeOd)Y%f zA2JH8&2KRZ$`PZW^ye7`-7F69H6Jw!;4;>~m$pB#{yp{ijG`?z_(KQTO$5 zZeRh^=c)VVv!S{_aQ>6P^eFf2V|4t0bAz+$8=lRU-IV(UIWYHWlwzgn&ZRE zczjsbE89IDqV}9a(`p$R?Sx=Nw1|mD;44@0Q2WUF`C9vKh8N4d3GX2|T}}tcI8E!w zeA=4OqZ?ck&ZOQu^HcUtjAZRRm32@5-x7~hT@S(mU!tf1UXE6ExU5lYcHFG~k}^vsV}e~uk8l$| z2#pW`{g5=eb3HZTKi;uZDg5smaj$aJzW#MMuCY!Jw`aM18o^16=bekN%3JKbV2`Og zE;Rjfgn0KR3~!{H+Kc*_n@X-mBoBO-kSKZ$Lg3GZPl7s9#D1y+o5WF5i2Kq#^+9Zj zs>r9PS>0${qc-j|@Wy0Zqx6q_&f(TaK7DSr0dP3y`{DP^#x;!Yd;GrnxW+w0O7ucc z?YuA`FVw6x3DiV9k6bKZ!(J$Dfs0c>qKKiywB{`@z|sk}XuTaYp?5IE$-iOJcmvt} z8*ZES^co3UL_yH7b?*YI)g13b*}%qYGZ^+>mNXT{Q7~Q{C-|Fh^#H9SgB5lMs+17zNY^W?>ntz9|D8#un=K z(SZ7Qg#C3cgJKNzU1=nIy7|coVer=lqr-+v1xTo{-sh;|5DN_Ntxiy1_{G;*?=0)p zZE0)d@qE!G`u6=Qqf0`XqP~!Iqdo+_H<0U~m%Q`T>pI~`a$RC`AR8pm1we2%G_R*F zTkw=Cdo_*tft_|cc(%{EmFg20W5HiziMZ(0aj`y?sGLEPpbcD>Q{iirCmWF;@AUWe zjCNIcwK+yTNf9|J>zwv`;mGf~Bfl5VdOz6UGyRhi>W(udz`|8G{hSk42uy9- zq|nrF$jMK(P_K5_s#d{Lyz9=tJxRh3*66#zsHGltDaF#%eCMZpt`&aH$`~`sG5RYt zsel#~zGuuHTR<$gyw9*1;+ll5qH_Y3uO@>t#Xh{t_~taX7;KnLEkvpzL6y(b z8MPWSyg7=#$*L9rR*5iC+WZHw*6AHXY6jYuKFhle$~)1n^I1C0@7uP}@y?>=dD=p`_s-B4RgO(AxS1v6TTgH}Fru7upa%F#R ziU!JTUM;-KPjR_#irC?#6i%^8-V0v9>z%nk%K%jxlPWqZ5VBRT;IN`>vw7d(|82lQ zyBf=*1Dr>gDkS!1Q47076S-Zvp_FWN7d_=uLE5_gR4$>fiVR@7eJoddZr3z;5JC*g z@nx=Pxu;+Bg(eHneC<2vXxdXYA;(RvjBdE*Ny15NDX<5?SlH8`osr6dfeo9)kn1*=VCcr;os;|!`4=h zIsy~ilO%O+#=k-7J-!}#+=k2brIDonU9HGL-Zs}5Q!!l_{#X^L z4-5RQlh7@xm1Es=77#gbL7(B*ByG8X-vj^)P0j_L+#R9ByjulfR==a|1$~0iD6=7{ z8<~2&A1J_|5zFFEsV=56RL%nm*xYX(`vA|0Qv+0j*Sn+NFu@4&)ymb;2NpwW1~*=? zM;G8Csx%1D8^n+zFLw684CzW~Mjj9<6Q)-{#)L@Cu-zM#)1qtO?#QdGVQptro=vaB zP2An^Cf2pd6JJs1L*&@m2o1^3Aa{7sDy?#4sAkC{--h?tLC^R(z2}V&P%yTsKz_V* z0xVvSZ1|;zT3x5mr}ol|No)@2UfHncU;nzCP^)kB2$b+q)nlC%j!jW4BZoCzYInDz zgMk3*@o)32Ls^1qLDICbTm{)THXP^vYUjEVHa6{3)DNBp+N{Jrr}ZHYEb7-}8B?Ol z;=9oe8+F*iwq$R;b6p8r&k#8btZ}iD)W;fnH-R7+=bSw%C-w7oRd1CvMLiYdk~ZIQQ-2p7zrljC60QJ$1C#H1!_ECV!-(JohLK zpaB+fn{^gfh0UHTa})%(CpL73@X2mN=U@s(L+3y_pCJp_<1P2|CA9%gO%N*!3U?5^ zEs2pv8tn)5g&KDcq8i|YkHa>&K9KU{$a{u!`5Q$G(5(Ju@fSng5sQ;3;_+Nm?39OB zY{`w?u0)@xv&OcLy@?Xa7BwX8OZ+?S|DJ`-CTl4?7Pq$FR7t5iDfbnO5C-w6B!7XmrSMhLaejSE-jTO*)cI)M}O9(7l_LZ70!Jr z9DBQQlA4@G{k-|W~{oUn`x6tN_ zZF20k>+&!mXdAhni3}gLlFs>DRr};Xt9E~4NBXkIwq73| zHFj=sVxO~f`_ziv5%x9h%?_vna8D8-}C}48r00I0sQ%@R|uspk|arJuNsNhy6DJBz4FOiJlruRux-)CZ(g^P^H~)x#sJ zW96blAtq6IIZW3gf=J(>vqC>1h>XR>Ixg}>c)am11^tlP3*vie&;n2h)`twR**GH*4IoKplhUMBG<|<%< zXZMx*xMLoWKdljuJqr8Uoy)`P3vGt<`u_HH#Kz-a1!fMMzNDZ6hw9Qh$WwCFU*k%W ztMGucv=&c*$T;5SYzoIf;4Pv|ysl^+gg%Hzg*g7POGc8V| zafGv_l(msu_-u~D9Yan5^Y0N0M|lHfihi9;S0T}#o*}qoTK2ohLOVlYp#LE-U<~C8}3XDmCO>X+=)7kjVRNK?r?s*BA3Gp8_ zP6K|yKk@~{^nhxkeJ^PUI}LHC^h}OX-KQ5+!ad0 zb>4K#sMib$$*n=Xr4-IxmVB`Evc~p`J7hw5b}aon^T&!4HYRg?Ip70#wxU9-+v#1x zs|r_i=A*-B`)tpMcK9>06g|E8bpSGkg^7{7Ni~K(20o~FHBw%oc>e~uAv`eCWXDN z{r8~mC{dM+QVd;II^-w;EYU0Dy3nl*BUh_o?E{0`rX+AkheDI0g=vZ;3fnvXworS^ zR#{v+h&t3pqR-G-KD0Ta4@n|&G;|pFtO-k^%s*=8A9YSfZh|OHU2zh26PX!*!$xx| zD|J>i`og;SQ+7^m@${S~&lMNuY5D6InyJ~pMR9z)N|VrqS7Vv$-$A!Z7R>XHUJ zvD=jl=jH_?al17GHnf4sMa@Dm>p+03~GS$X=2sF>{=CAulGZQMqd#k{*RmBAqOu)NU=G^K?#X{58Zjq zdJJV0-DaV5Bj^F(Diu~P+FPk2xxlut*+&iMVwkdD$F%Kma7C0K3+Y;H0g~q5bcZ$G zJeWoU`E{v&Elh=8tSN6&f9(M)@b2r`5n0*&G^zA3(>8>UdU>_;1C|U-$sL>`e{r5% zTNKlIobsrK^xqa*{_UYegWV;+a-XXE^sO&psd7%vd9UxiN4fPPoxknOriwWO*-iL2 z7bDsW8N2$BB|NLf2K`{pRBo{xOx+W`Fn_DCu7(67FL+-rcnnbjiFO&=3^z(^6{O;b zd)yH=HuzB6Di>g)jO|Lld_4ys;{WN`BV7dR$oa(m)bm+`5Vs#N1SHVU>E#;f}> zYsIJ4q*x!sh^k~4E=VvpCVl))Qv@0kkZnkkawN0Z1VvfZOv$*?q-1?N%^@lL2PjlD z)0iRAVMX+LC=stU%NwK+p8a)is{#gwSLW&DY`{%6xs%0vh5j%vs&Uo4TIcjC9d?54 z*mW^oEHD7*gNuChgI14nAZG;g(wAP}yr8y9U$DqB=}9B})}L|st>V#5bI+z~SD@%f z#!oZ{kGxh8y~)rDKBnh{f#HwH&#~OrD0u&j$0wZNEKXWNJz2cCsRDs=-)`A2os-%p z4f;C!`uHxpM4x=e3_A+zVyL4e)5iPy0faTzD-&0D<#qT(UgoEqKu4v>Wvcw?%9?g| zs4V(S@ScK}Ht5Q;UDYe@e6K0&tkToi1g(u=8fg`|nF0=LdnmQz%>GI%0;jF;P`-mk zbzm79uw-s0GQ13~%fPO%KmaEZ2*BGckE&46Cy!f<++y=$QaSbexEPtY%1ZN<|QnY+P41N)ozuxXk^u7=^PI?c#WSHZ5Sm-8-^zZAwGGP0FJ&V-t?0q8N+BK!`T~? zsF{(BtG&^W$)`dW31~piJ3)o;qS=Xi2QD85vA4M7+gqIj^nD6_nsUfc&g5Q#6LX50u$Sco)zjosbrz!BxD19;>^ z=gjUT34P(8kM)IT-EKcO4!$IE<1)gH?cW;EIg>A!uLyUy!_)_@{-_09`9jPzT3ln z>|byn=Z7}EtQg??jx#bbJtGlUF-Bx|lqa9k*NGfjmVeGE{izPFv9-ceF<_2C**Tv% z=uC8r+ywAatZ`Y%bhNW&zHvfl%fCuHE53rExg(=We~^sAA&QqV$*A?mWK`rOfs7jL zVMM;$M@IC1hK$NxL`D??hTY{=@4B^@AFIc}cYztJjEz7X$oPRe5w8WXaI+ctYbu_z zb5cjp;2{~Q{`0m#^B|z`iL#E@yb7{z{V`c*ydscw)1xc~eiX$y16b4aZ9l*D20umc zQDw;i!RI9lzMTAP1z-6UE7jtHukr^8zB1L2O-b;%9}|3$mjr?@zsFs|cdt?KrR7hz zNsAY=NqOWJL|8*w`E%!dTH!my zW%~K{&BsVOk8V}(AW2c}4k$V;e}JNjN|ii1J@y$bfMw3GK}OFBaXd4H{JRu@3F3K=1*Gc zm$z6yIZINx4+PNt*&Im<_Jnwk-x@pc*Vhp|Qv{xF8PM90I$br|Dj@oGNyhRdovEyh z1L$mnWjf&74Uap%L~wuE;f2A^Gncwv~v0;w<=s&`7rg-KCt6#!X2 zl?!8L!8}7noUVGtO{{ZW4(GH0>~@9IHIC%8>|lQ&3ZA+RpgbA|R7*cd5#n?fNI0`C zBbmjcn#$9YSst7U8o z=NK}-!6#xL^JmAc&+gw)0GATZ!m9w3fLr_JAqCW~fxMXYjkqlO7q8to-gc~rD)sT` z;)~<)-=0}7cN9i{>lH@t55@<1y3PWgA52dUuJ~-lf{W?lVa}54HUAJT7w7BQAw5je zkbhXF;X3B|;a_KL#^b|mofOfMAD;7g#k2g7=gY(5dd1T@{Utvb-v_kxZ5Az~BD&=F z2{K*rthoLMzrHV^A)iMHSAcJVnrFdbkSBVybwPr&zCna4~73jrxg3izcffQPK(>sU9#f*wsnIvj(Jc-X>wZ#{8N#! z{MNNu9wm!A^ghjYtqdr}e<(|$C4({NG~{!(j*EQPd8>fL>^fZ+`$K4tAxesP{~;7n zaB+)H=K+iP9R_{Z!3He3ygjj`D=}%erWTZfx2?U-E^p1EVY<9+)hH==wn}4m7beYi zr?Ga`oG+FV{*`%P!; zZq?VbS`p+UJM|%B;oYVp4_Hy~y{R{3s{(jt zKVCrr!Gc?my;5Pj)LO-?n5WsY{6S|d=eMsK1-GmVqI9pCQ4;b`dt!#i9EIL~GafO82K2lZAS+0IimIXUa zV5j2FGOSZ`l}0;KO{eOv(qB%1{7dH%Am~v1*;!fN2uP^!yTef?+noUwEL-q`<^>Bb z?f@;1maCXQ&4PRD(VgLh8M}ft(Cq>3F5z1BW4_=?c$=E}dR9b5%x_b-NYl93Q9hzn z%*7uXu!1kr9Yt27CU7*%cGg%ub#GBGU9c=F&X+r?x<=)Ug%OLtzh%?l;k#X}oM#c= zkzKQNwVSQ7E~0oxtLB_#yU9;feb1oyO^~ZD9L`t~oWIS|fam#*i;G%4WUzO9wvOVE z?@@2Yf{XR)Z#?1I4y&13#f;}gn(@85db6MFK3ru1_xxMHdA81rborixvkBo$LYv(K zocrjC!M)p~=Eqf>vQRihZ8y9JIQP*N=FRr<^1h5yRz%6-J-g)Jt&2js&rQypyMwuh zj@S-&Z%@5ESZ7gjEnU5HeMcrN(hHuv__T_$U3>~Vcj11&DR9Ffx!+UWr~I+Eqd`|IT_ zjmg(vlhcD7fA?h5s1TZvJRxPD%FdLH$vWv{Nc}>l+sdY*$s78V!eTNnvULEB9~~Xl z^T>npo3667NTE7;QXj~))u(X{laEi6FQ*Crv`Vvrd@eD?aw5Iu=|MXCg$Kpy0eNs#cBB}Q-+m(xicyJ0?CK@U z2q#CRIFTc)0X}=IKwhR%NOVL5FEI>NBXUH*@Q!2b1vGJbAjfrjFnTOXZthhyD*F@3 z!o_)(UXg@fk>l$Xf01QrHatD}>tAafBg=JOsCta7%JfSXuQ^o>f2k4Z@bn-rvM5;~ z1so9|vGldKuxL+Kz0KQAm@HKXRF!P(|99uN+{lN?`>bXQP~MvTYHVWQ za?DLmt58m!kcdo4L>`gT18lZE=Cb8Yqiz;zjHn)d&>Yi;W+1_kk4ZKrYHVtvGC96# z^x0@cqJ#j?y+InHy?{!xjMschim~|Q$$H5%HjDX`JkVvLkjm?J@>LcUDhUZ_M5ctF zWM|N&G2v}iZgyi6u0E3>geT{xAJP!1=|eYpOwtukzKhe~0!x%%<0g!%L^oL# zeU>i!nyV*|NyhUuzJx@fu&`h|Q9*3CDw|vKY=KC~F|Ybm^v6+Vxr+_+{ZAW8deODQzu>=1pSH?MV6Pc zMPl}3pfC&VX;&Frt#~#VlaDHWma!z%zWV%?^nzTk_?M4oLZ*z#Ni7+*(V*ZlUu0}K zAWz6}ryj#3jB6Y+CMT5Ap+NeHeg>+z_H{%~dgRUU^kBt`bATjA7{bKAwhfP(KJg|F z^(^=wvCRoJP1kij;u;P$9ZdBcmris{wM_k)=NZ&CFvrqe>Upw|MJFb)be&o<#j>eq z63Z~CKY^6*Ela1SO&r&wwu|r#$Dx)0?HJ}W!|UWewM&zD;b$ zrPxL5d*60c&y9&iJuLUk_gvK*!<$f76qx8Pbi;&Jd`$5tHZ`%2#Iz^Wz$)K+o)6_J z{5GnJW1HVQmPcLUP8>CI+cBvtn)E!6 z`Uv)!ZJX5hiRXK&vo>H+BD6M9?Wy}0Fe}=m$vTe5L^DQbBltg=k`5i7uNR9bSA^QZiX=QbJv}{m?dTJ#Te?krPp7Wq1{0gQwq=66@*Qg1 zuB}-fwH)0hrejiTqT8CGThzBKmsySlNRWSYBE+0c9Y?n{)6uExIVR~TrS+BasWGYl z5GA2i+i=T9MZP@~N@^(@Z~42v2tT$?(&;}XNCrU(5nsA+-L zq>f>^#014;+YGQp@E=LK1~qKQ)l8lG{sdGeb$ws`5$xhn8z{wbscnMVHK^rH%<``+ zWK+kRm>Q1P_XBN0VaiSFPfTAkd}=w4Nqp++hO3!4Q^atAhM1#MAJ|9zRjqoK4N9I` z6W0$UMHtjGZJ(GfHGJRKJZiywSw01@7BxNBk2Rg5l`8%K=a@hfz&BbGTi7ojh#s+} zZO4|O-Ha`Rbg^aYwqO30g<9CEBa5g`31pF*kp+!5kfk-SrI{`@Cx$7pr8TkDL{^JB zt*6#^wzD&JI=V}3+xCg;+SK+eH!yUaPF#=;#IP*tm=jm?CloqcejAoUO;5K$ep}Rc z1YQgv8<$$TCs^9IHH*5g?n9vo$O<()$E7;VhUw9XlV1G>< zvr3RNPIO{BbfN=EnACQ4pOn2*Wy_RvtsiMGUs|U1d}pMAv25s`NnG1N@yL9i`Y`3{ zZ%H$@W0;!lP~Wrzo9ci&YU)suS|)L*Z-GWIsRyiYSQG>TmLo2mxL6Km$FQjmwV{EhIS*5Xk-Vo0wD(l?5{kq~lN>c-l9q2^{LU)R;j3Kt5UK9of%wbZQ$gN3KUb z!wh`tJ08dgT>Th;CkH6aw5Y3FrjXIhvM5LZ`A3)X*LJBtft8p=9YeRvzcSaOrjBgg zTbsz*AhvDSCN4F>rZ8;k*cE$V{6v3zO)dwLccCGw9f zGePrDvj9#2WD4{H4GQy*xKsy=+161GgZ7w!9qvph2simh!1AeScrJnEI4CR|w1fI1 zTay~e^r`28o|#a~aLn?rz?_e?Y=f%zZQ@u|2e9g|fMlUvg*r7bbZUdxwy5h9%cU;Z zbGC^qUJs2W;+oV%E8d_EFs5Nr8?>GaRnf+yHp~PdaN@b}4SJo~4lcRnA8Av=^5KL#&0O2BsX@KVNY#WRk+k?(cg!FNIAulYOnxH~~Z-JOJ!=ttkPbNh< z;8WZ6@UP|CJ`kPlnl|Vi9nz&F)Vv8b9naN3Bbz>m7Z5g}5PVy6KwsOMYa>m`Pv(G9 zAmZPOqJddVhw5N?89FsxFm6oho5EVLOxM;-6D2x;N4pqi69hFlH(c8%>aT>VQ_t5? zoKGCf{Wn?a#MY^=yLJFR62z-vP#0LuL}>|@3m8H!bwS^n2A$wq%%VOlpX5Nmx(Cwo zCe$;0U>cjEg+vWtDGOFOr9y#@A|U9P`Yx#*2+{<+8V*H^fC5r22W16}z{JUzVEbBW zH2TQQn$U@wZ%_}3nEF5jy6B`qJzMwHmq~4yCY2{<8&`hRfS#EXVKlV9bJL_Qj?D!v z=z?KFCN}lKG_ri^>B4wLA_IhjjqFY+>RppM0zEpleNgoiYJs3KeX2uer0%f5cV(E` z1W~5GtO@F89ViU+sU~!~p&JxXVAv?+Gy@lRx=^Nu1wH`_4MfkkH3Q6C%haS`kfuB! z*Crk+R?VXxEUct$pgv6-%?zEmKJ`JfTcEW;?fF!%f7{fU;8F>#2~FUf_|ySq?NS5A z?^6T%Xili^!wA31S1=caC4Kra<*98%c?4ViHpMY_r3+rBf zS|)W|;d{_0)P^K?LLHQAt%Mvp2N)Ap3ur>iH*NJDnACSs<2dNMkmGde1V~6W=Oc+I zdh%f|bQ|UZ*8iICQJ5N-BP214+Bk_5u^5v0lXDAXWJ4|aeaEG;4a&erWn$t=DnM6< zi&_|{uapO-ATi)L8wg6LAj>VE`Y;v1pI~B&e-53mrX<0j_6{>V|C-C4+388o&Zlen`Cli#^mgrbR(Qm?njW4ToAjpi2n^ zk9s-?LtUo^vg3rhxcU|n7OYcbe#xztM@<|ELbFV2Ap4j&Tp^A@kAc3OxYP%eWa3fe zP@LA%+|hhm*|s2dEzdAfC&Egh^_^=Ip90DI!p75p*FbD&u7gMjpr0TCO$%k1RM)s_ z00RhE0~icg!xILEr~AI*X2%omAE~Q|WIVJ(Tyz&)*!Zs<$Zr`GY?E@k}Br91p!4()-5x(yV!UBYtCK|;GA<%J8 z${ZM$fyM}t(igtb6tZn9*1R@YQ-Lic0;GWgA06N$C|d3p)I@Cr4Aw))_{gZO<2f*hi`&*oDRwu8K$Q1 zo7OGqShqf%0LQDp(wkVfZ-WWdU6j@qx+EPm%u1E6+-K6#1$)^OQO%Ty!Lx!hCc=5&^^O)HZz|zR~6tD&EEAx*^uE zpeZb57YCEg7L(L;>U9cR$Ev;-_SQ8swW$GfPeDDVdQx`A=Qd3&G z#P+BIf=^ny==X9;LzgrR-I7s+X$uA-_)|7nx&{CTI*^90Qhd_R1;ii;2{RXfgR*Ow zxnPc}zY-+)*U{MNnz@=o!P%&T9B_bw#j0Ivn7LA_Dl1oOTDe-w%4O1Cx|oy(E-ExI%7lFjirOg6TLv%%FZtyvQkoUITC^&=R%_X@ z?eAP`7`C7aEkL<4ZI$jMN_PTAVfuw_D>ZFt+JgKraR!AZ1E|Qd(wYUh=%7;H)`XhE z!fcqg5SM^Rm*xmTgGHLR1kGD$U6{8hU~z>b1cMYk!oEcY2AXW5Iws(Ec+** zwWT==8V%L8`nGZ11xC0qL&cJ!GH-2LuD#LX0p~q9tUMPD6!ZieVDUM^wgp8_C&*0L zUuiQ7TNZ}wp_Y~3%C^U8{h7H3u0HX$$--?!e6PR9EwqOEbv(mC95+%~I)tZ(qkPyhod$DU>-9+bOW!Gv= z!?yDG3&WN)4O=1?p31O=WvN_10`s;$^SV_Fj#9CsAkA83CzPG#Dv z)p)s7Zko2B9C49}rY%u!*HR#O6f9k3*(%?GvTR{mak-?N)Uey?Nz0bBEL*K^*=iFP zjW1!?YGPJP!xk(W)Opfvt2_$Ia%+9(6QA1P4)T>H)HZD!mMu65kw2tmtFC3=);OB$vvZ0v%%RJJW?*|y5z zENxq@Y1?Wo+ZK9dx}sM$8XJx)_ArEXtKHSQg@}{MmOz#(J`369tz%fMW(xZ+R&51 zMVbMk4BG*Zxu~m|9uO1!j{(wM6$(}Ulwko5Z1P|Y-=?-7n<}2kHK=Zgw!sJxl}y=f zt%{>EEnINvx{6)`dlO5;rj87S5`6|k&L##Bi3k@1A{4(Myuy_xqOId96l9=m)hUrv z4b^gB*$vAL(HO4FORRe}sY1Lfv}!`?HQZwRz|r1~X84dh@2kKrKfKr0&{C6-a#%NRH??1a3R z@pif-DHK)W*F*-3q4_9i#B?aSPeoWBjMy<_&G0PhI@kp;;~Ig5_{o0t-Ojq=q0d6aAzz zybl}`%$RuSvs8a&WQOfhOOUXN+Oy+wcI32x*p#t-wVz@?p<+hYkO&MsyNu!!#HdrT z=_AS2o={v%S>9^T!Mf3R_vWVr6TB#Isz?kUK#L zwP`nDVJAC59a{<~Sgtr_ky2JUzU(uWSk!@gj6jq5CSz5_9&!ym& zMzhJK!ip1e6jm~(8YpbpYI0zPXUbWIC<;L*us1H&YQlW7J4^|2xl&|#wwhho;+8{) zngrqvCgA#!dn2|46boMyGKOL4QnV7&P-8^$Bc;Mox`o(Elh|S`;A}9YfY!^vTy;oAg4ouo(t;~oiq@c%YpN9+E4s2l7_V@lTDBq{ z!w|~GlCs>B5+a`X(2U_qJ^@vr$OPRvqFyX4v6aebt4bmL%r zaQKj{6LIB+cDd$Sb!ZiuhhtD7d3ac!VG>6>s*^gjbD8Spntu%~9~FEFw=40lqwq-C z?O*3Xy5ivxqWz#e7ncWFv?_LhDGGiavt)4u=gP{nCl7B`x$MC9dc}3jzsB1gj`U5V z5nzM730L&4I#;DSN#$L5jT=J&{ctv)%j-f#<-e;tb^x$E9`iwD^l$zQP6=VLW>T%ld!Vdl5s|d>Nx1Tm*ODh|EspYH%W<`n(}Og57DvIw>A~5S zLu5^$1^-n1Upwg)Mwhkaxg2k6o`xr<2YD3o8Ot=dWQ;`#&uX;@8AQ1TSL3o(&ci|J zeu(mCGEvIgv(Z?cMxO&(B~*FPjt~?u(>4(dOXVudW9mq%)(wsaIk3iou)5+0QMCap zHQp3@yT-*soI?uq@T%a;d`zN(FUirjt#kJK<6fE-0FI)FE%o2#SwXUd8VxvNKH!SO zOI}Te_L^$&hM8jXp8=9*qV*CkKY zL#FA2ak;7GUM4#|DAL6u=GqMJZ7F%6#Qf%?i$h8&%NF^lF)ad|;yAdfVMA6~z0E>< z%$Kx!+k8%*kO50zRAIWF#azpx#d$Fx(^hiK=fz-)ZF~mU-o-X<-1a``v4U%4f0HpR z;ZMmR#|xYWip=DY%Taa!eV3*&XGs?l+U6az8brvjeKSW1l7CvUB;?^gqp&!i3iPPF zQtnL2NsZqlF+A1pn&m9!X@D1nX)~79^AveQ#m1%iIbN0WzK#T(sh$?sc!^S9i(uw! z-RzBxilXm%0rwf*)NC&A_UUOjKaY64TayaPj*YI^g7-8C$-ChdO77TJidWP8QVPKqSgqMp@`wypp9WRoYEAg1H3F>NU^Mci-b}rbX0c`) zaNEx3FONGMeg!w@l?WYt6&Zd);}q@<9Mlnj4SbdGPsMQ*TnvXO(J^t!S-#G=oPtre zi6t-2)3CPOZ_4;iBYYVZ!@+tLvVu=5d=JLtL3;{XvlpE6;No>Ui<*-s7yP-%Ax9g@ z;_QLx$_Xc`=7Yiu1|P38kstk444L~nagJcb)i5OBulrQP|sPPY$utnTV5(+>~H zF^82P%cA&NN^(-9syULdVx6%Vnt{uv1f4b8US<4JVDE_Vn4(EcvE1Ws!Q+f2d4wyF zTIr%pZB@BqCAvdV0gVwbY^k*D^I_ANAC(|_z>^~~NYaE48kniK(qQLCdl_G*mwaPu zUpmcRNu&(m#^^yE=P%PN;IO8M(<{I>Tdm@20(Va=c&^IfolQKZ>3p8^;-5VTRg)ty z8Ngl2&0>d#pJDVPW_J79M~JxDRwV$ao(88>B?LsZmXr&G4P)f-O2Z8h6&!oD&6UvU$v zvF+_9yt~8hDk{#O6`wFe{@%+$C!2eIov>vT^me74x06@z28ZT`YqNItcHY7#So2zK zzrw1lan6CRG^M9mxQr65nRwF;RBc#H-njVtI}o3<{Ct+OECk-%;5=-UQI5m=cSUv} z^7wDjSw2rYXg)?qyUEYhh#K26VmZyVwv{HW?WfA5V_CLlu>lW) zmrOY9s^u@-B%iK}LFLR`#Vo*%!jNWZQKZY75Ak!yYqJ5_d$}{!f*qXPi$qJ;g~s3x z(AwI)Eg))F(zTtiP1o!9IKY|%q3%MfHa12zf9{7VG0G8(f(qF%WkN)vP($ZiRaI52 z&3Xq94Ne*NdftTFyp|-vLw|qltlCZwwz)rRF6lPZGI!MDv=gPH{JmJssf=zMFI?H%cnKq*vcXG^*g?x+9jyiOCDENts2u$@JQVeJww9XJv?y7vi+n?ETkPesEMi&= z7jyS+=Q`VlmGc$DJGM78;qKIg*EKmMx=Kr=7rMU_^vP!E=>OdS+|YM|ZWx=vUvYjB zvg=LwH_Xjd7g-c;s%G`W zNRQLEb*PQm=;YpC7zErb&M&hx!MFw)c?=N@ehtz7&Qmhk#?4FU`Y~vI#mRrhRz z-O#)xgj)=zyB>%>Mfov&wMxiU3|JI{vhNt+C)7rmvAHxj z`YQ4y+*}Q`O|w#zhW0}LFgk%C=s&jH*-W6kfTv2 zHmgIYrNcq23Z6gx`NQk?>`iV;M*ojz(WTwmPz6SZ8Iy9Pw}uCgama1M!N^pnQ@Dc(UeCUqX-zIg+mo zff+I!QA`{j{=ebrY53XxGCI)?&+xY~Hrroc9gfN;l^$TlO-)^M2F`x*Fwqc;o)~9! z=RWGib`kSzL^NX5ilMY<7P1;}0EMvg&94Yz5n3J#=qPKd9(Sh8`c9Hy9ml(=;QC<7TFV>AA{!D^w9TY$u=tlh+Gs~}>xR#IZSDppGJ zDH#l!$uE+ykytG=yUFdc?21JYC5Y+ufYog=f?eyqCr(hreiXw&*rtJ|^*?AwXEn{s z{UDchJ5ZZ$gZ-eEbvsb&3(Eaq%9alzF#MU(U{y^@O8Rl!Q(aGt>8Z)Y-=Zo z=j+`HzRaTC3chE>V06}w<*eDx-MB}bE#=xPC17WINoNYn1wsWYza1E&)p{XRmdujgYIp9!E=# z`VlLWhtk@tx}qRl^mHBV!pGZ#pX=)q6#k_pJZ;$&jbhC;#t(42u?yB(+IARfGQRH`V_}*lewMmkMfvg&fr(H;t~x z{ncK})kCYEHAbW?{JGT0eDu>(eGMqnf zG?ilkoC?izClA_e_uFqRF2eVLTa?^Gcy-3T;Mb4)@&ymnIIfT9dMejAty{UtU?4I( z+M^pVF6I%NIN-9ynINKtO`eD>? z(+^{t0FuXtmdmIRzAFULfAFNfgR{G8XbodW{m>ZMsCnR|As`==lDsw3wQltpNR_(a00$Wc+ zHJl&~fX(94J<=*uoq$!I-ljN}ma04jJ8Vzq*I&1$@9VEo@O(>pO133ZjScSix|WV# zYRj37`Hb5WH`wt^#to2nIhV0Fh{oBBn`(E?XY`Ek7Uwhm2OiFl1N##WXY3KWxKmu> zmct$pCD3l6O#2g_P~SKB@y1(VZa6ujLSa=jOXC2GO57nr^cL}v;=sMOVhL=J?-&@F zUh)jy9M=Mth562bkx;t4|6)ThWKWIlr&XN(O54H;-To?puY%Tx!mHE7s0Hvrl;bhAr2vcWVdvNYbr zL8iT-9){^{6@1Pnq{%~d4ZLk7E3+gkjL^`>4XAv%Dy~rua0#=PvI(NsfM_%!#! zif6%Q8nTW3iQG1CL*%w~DqK!6>Ywd`x^+t@l_EwRiKorq( zWA~k%Inj zMt9o?aoIInXmb|FGX{tG`WxvI5%v$OZ01`*p5Emya)98){W>RS1e1SWU&c?eOom8&i-h0Z${()=<}X^SB?lK-hAbVIv=nZ zLdL=WL<0;g3R95bER50_g$6vy)U_mmTbW{L%{4-{ZM(cKfvY->?Ry_ec{8?1DV@C z-`qMCI{cFlJhyL5Zu)S#>BYeR_AMDkpx7(NkAe!U!9iL}BKbPa$=NPTOGnOZJJGTf-w?7fU#pNfvA7tDG zWjJTzFgS$0?nw)9Dsb~5R}q4O(X?#>iCJEVR>M78w6?VO_O{eH;8{^Savx+!u^a#Dxdx#$G08^+j?C5z+kMGS&+u-{sK z6%`;icPEn?`O5YOqdU%iYvEd(d+dm0$V6@g?|Z3Y8K^Yeg*#{0@^P}`>lH6$U*9c< z+u3%<0sSCd9DmTDpts3~|^?K+2~as<&{Oq7knj@8>~`a8Q1ViUni1&r|G`!4R8be6@m_MXJrx z@LFZ>$ACA7?xxx7xgKfbY`&9m;>}sC-?`MfF6p>YQxxib z?x{`i3Svp_J2Hw4nt`9P@5bwu}xOdli?kg4Kwlrq`aGi|Bc#EFe*&Rv0WpEcHet^jt^^;3eJ2GDtRi znbGF%i+=NNtN#3)WnA1JeBU!GHQn3{AEPN!CO2_s^6AbEaU$&vsimv2)WG|R!;9tyd`JnX1)q;!Baca(C&Up%lQ)= ziI%&scNA|dxP>dx^6vGi%6={!lVKpPaFMA!2j1`cl%;~)dC5@*a%HasF)JGTiNt+2pK>KDx~c!3=748RTRFIs|hXqh1P9;-9~W#!Rf(Ypao-e)^i`%Uff{s?p3ny=2gNS z>fc4j0%Y;?PHNV+Zcwvuy6fI`tZn~a*0J{P9%kFUgN}u%`EwPl?d?9&K9RK(;VF{a zOSRgQ9bNbM2RuLdE!3)`-}gO~Y_Z7r0``TD)%Yv5Dmwc+XjKXLe~nT-R+N9=iq+}c zs1(@QPyIRO@1$29>yOu~doaWvkpa6)N#}0<3y6xz?_XVrUBA~Xg6LD01blDh>wx%F zFQ2^4(tzhVgxB0st2(>;4xGu2Y+MVp-bQg4YWy!0>v8D2lap(fa_k+gAAIadpKik_8cD zG2T46C=GYVN==Q+(TOQeI%woEERZxypBY3ynB?^buC4g%1s@tYOT7$kI`7l3RL2k{3) zBfz8vmiY#Ku zBECfcs=K?X<4$&94@6#rH^%)4rq!9B+v3{OckWQt*slD#$0IF9kF_A01=)YeGq~_* z;~=Fr+$Ild2Z$=+u*#w(%dYp91sN~0>ylmm0CvxKnBE(=WAFFj@!v}{3ry{e{V>Xx zQJy1t?1%gP!d8Mf&G~+^@D7eT&)n}Z+1>|Y%Nd@nqd1gr%9fELjb~zubaiJ<)t%eT zyhVsSlA*MP>?B0M2&w+;YR?hH0*+u|!AeX2G4JDECqcE+*q?>l z=ps+H%(-~aVjEQ;nzlw^Dbg;_(11s_`I>IuBfK5fs6Dy6RX*%P+Tev-ul`iZ&euVJ zhod%8HuUix$XX1w=1=b@YEkSDrs*)fN?_D?qiKn#eu9>nKdv^>bA_M(wbU$+LEkqy z-(+oB8x7X>gNPN?gTJIk@)@72)K`tC4B=hufUmIY^q0Kxpj77}!ku4G6R~sPCw`A% zkUj4ZR+-gFkhXijM#)G6K#?MdF-a3%Bj%RZ-m&eyOq>dB<)P)xY7j`^9>j%+4}B*n z3XpMwDijCs|5&jhqTKGP2qnTc=|P#jSqqgkSNzfQbX1Xy>MJ zsB&++)UzuGe_x~ff$dvX_1w%L?=e*8@I`YQ4}|#*ap1QCZ|mnjUZULjfnOc7*>Llq zsfg3!JSh$Q5^}^9SD#Ssw%bKIBa{&WBJyF9vj;O@E+rYfL0rNu8BL1-YP~oHX z;Hw~eabbk;4^`OzDGGV|dttvttC!GLn_7)~MEwm|UWzBBYTm{;O;?Qswk}c-agD_G z?0AjY@$NV~jpukh=MGC&_nvlOI`Tta7E<28BOG$OyOZwb7GznLUTN#q{cqF4h1+o0 z7KnQ99a?X9KchFPJ{ts1vzI6`@5PUrMuL3#C;^_8D z(BD0%%irY~MUBjNQ-Te?*iQ+%w^V|?eY~9#+_ezALD9WyNvTlzc~(9>efaRfX+j>7 zzh11fifDgzE!|H6_-V*i&MUi8Ce6n7C8oj)^xV-kA7P(65sznT*NPDS?ZB zzMJAB>CZ6ojXa+cxC-aRl)%j{FQ)`9Sz)5&Oq2{n$xxK!qU0P(R(JiK^G|T^A*FPn z8>VGDuIEple)sJ8i18e3tY;5pzCI$~eoO2#@~FQS z|5eo*wyKDiELGyDtP$n!&r^I9>JqB)Ux$}8Lo)(@E~=li>L+W^@j3tW79Q#v=0zsw z^pa)pd?-HXl*z#N$0{S^Mfp;AUSxRn7`&#63{16Yl=!{9wj_%O0K{E_~OI67x0wR{~Mm? zF?;gc`PJ;V^ZasjdOAEk%^wa=v`3Vmo`z?SM#Cr5kS|70PEJqr@!6w#)?fP4hEJwF z$-}>lo{XLV?9`e?AayJ2q>DozjtF|S3T3)9doct7XE8=J9afIJ9afDvqs0V#f%&^ zaBqyktPoAaydY629IwbDG9%v-qmql{h#2HhW~tZTuE@h9S&fic^?|%JPct%vdirA$ zk#C6gm_&~rl@PPV>?AsaIxxLgL?g4ujhshEWRvKW)un1o}p zWS?Y1Fq{l!M3q)T8x9xHE?5j9@YHZYz9BR6gt%m?kpD$NS!{$dBO1vN2zf-zPM?Pv z(a1vO+pYd*i2hglXI}N#{^Go>SGeO*(_jjoDAn< z!VrAWG$)6m8S%1tl;htaD^FLU#yHW>#)O?1_^)|ZW=d_ul0h1a z-|ykK1o0iT!^H1r&;?fTh4_3vB?IVCE5sDBd${J;5>4CeaWpU*`#mK4#iYku{jz#PVBp(k^G zT{B3UmqmYFvn9*kK|yampNF6V7Do|6p11^Ey}K(^YaB95X~uXu16Lr?Z2RAz(YfRD@vN!x*l30F?_mOy%Y0g*pn(T zzqrPRXXWgK(NeVQPT;>XQ8e60Ov8nw4TDc~1z;ZiJj-y0bTBjFe=<3K|3)$8e9q<) zMf3FMy!hu+K$2l8K1KS1|77ZUnimSPUkQT6vEaDSQ`1q> zRmhlQ%0w|(Ux)u>F)=&kEG~Y2`TZ4;RXCq3q7c}q*E&xVe*OAN$&E6#P1fxcV&u{6t%(sOENL9iOhcqbR+8K zY|cVCrhf^HhZg*&iei5zI_DF;OzM%i|e?&2DK4hLA z%2rlycqw~0=f0XWNEejv&u0_AOhmM@Ip+%ft2ewtY&i3DCBj#1#je@ai9+G&fNcnAkJ`-7(EjrNx&VBy6C= ze=@NqQn%n^r2thjM)!3k+?0r^CFMzarBtJ&jylWDJ&B%D64|bADuq&@@D0tG ztu#Wx-$=5S-!F1B+(Umh4<(@$>5>(x&`p*tQ6e~6=Xxk>Dr2p0S({ zM`v|c0fQaY$~nUt&KcHl&akF)rhb2&O`Z@2KC5z9?Mu^D@a}KlsePwxF=J2ayG_+L z(T3fl4asV|>2T-$rff0W>?sso+`&^Q-O0QA3q9d4%tp0SRe6D)vqzBoxb8*tl^5|6 zJctmIAY&owp%9Av1O(}#S}4yUe$B*}BWGKTfqV`9F;x?pY9cFvk4jKwaa$E%sN#!O z@mali=?0yt;@xUw^HUehhhKfZq!~K6 zF6l!4oqg$bh@ndiJca#rM6p(gNRg^|hD-9z5z(oxTZX0k+8V{D<$6>#lVwo1WU zHp~_?V~mc;F)5n+P~-@k9|C%y7|lkb*1l6Sf6>UFb@FGM$N}8uMLNvLBT_(2RlS-C z&EhUwc|dMa)>!n{SYVAsRby7xnDy6~VU1Z;gG~wcnW^$vj6p{*dDM`3C2E&x`1kkU z!{kO|f)_5-1b^is2B}gkS6!Ddfn?YMt?ka~<7yvH<~~xz9*RcBuuChi6@|@{DO`C` z0j&AHi{(mX2>&+#($C7Ig-kN4q?t@IOP$l$5{uIWz4NOqEz&k$K2hcd%kyZF46%^7 z4;43!rnn7LhX?Z_>J0ICXU*de^7C_s5m*cScZUBm)IncL@!Z^h6F?eKKA5Dm*|$f; zs@Wi_4J?D3bqnPeW;0$1TEcQot5C}3>lN&%!=H5CC{}F*il#(K7-otzIB1bZ zhdR5_RTYT5kS9AEAj;4+IndvJt67RwT60#KjY-Bnk8=7!1b3)0h_p)t5s?i2Z2#-5K0adq*yjSs$uW4K2#(^rCOUkuMwh5%Vlfn?3WToeS9^% zLy;Phl{UeaQIRLLa#hb;QBx9P6~VO~VpZ-&h~_@+Bm^uXX&QO3(~Q*`nZO-aW~(e{6VWJA`ISkYV7$gurnZV-fvHFyk`>X2 z(aHk~2@KS#fk|1rCUkf>ydn>w;L#D$4Dy6r!SM$OMPgv#3=Q&#Ub!z}RR-z=B z9Yg5%Y9xwR$Wc>>xa;LBC{bII)T}*8Guz3f&Uf|7W%^i>iuhfOcIbo<8g24V_?3|5 zLp7)xXNxFD))fb(b}Ploh9)`7cs8tCVaIV{!=A-%8?LZ8O0s?Z5_bK1D>=7C{6Ji)tbsA-v$hV8g_%F z-3%;e#X7@f)(zl{ow~;Nfwx2VWN1wlS5qd{K$Rghy+E4FA3O#0f#=JH71!bR(wf2A z{L>0f1AG>lW3U0mBXu z#GnLnny4;5O$cAEitEzIB*i%^NWc;@<7A!laEy*y{)sJDF&7`==ogDIxDSr|Q8^+x zf0f@eO;<`996rQPEcd0}g?C63Ibmd-K;R0A!ZFGDuWOzZ5sTw%vfv3^S;#{%CPo%< zI%6@|p%L6_(rRA1$kFbV*S~x&J=-BVpzC3VSRe`?Jpw8mq1UzBIXGViD)Qqcgq40I zQBD#b73Vy|BZMSLv&uRfizPrN>*Dp*R8Yiw?h+qed zu!JyJX~Q}#h}U@M8xUV8lHvCMJ0eDneC;) z9$=+W$7;{kyzPFMOHAqQKsN^@(IOQ>g96t`c%`QTOXP7BaB%W?a)Es!m!8m_S_#dS z`Pj9y!S-IsL`3#}lPOv!L%42M%qGyu=no-pxy0K%d8N4QA?XK-q`&@pw|QuwTUI$6 z?1L>bkCLe1Bv~(KJnKVI7egCSR6h+0oDLvgBK)na4#k=w)Y8vUvGqWd8dS_)bEb%f z@St6k%l00Xg!-k@&q%e6et}w6b;e=?vx~P9Uvr7A7Meav#g3u-A8#fpcBSFtPAwCkp0@E&qVHrsdN&n{WzD^laLIu!;O?XzW)we=;6R z)v*bUShU3AH^-%nKCY{(Had@+nCy~vS#tml6e3lYpC=zFc{LYpNe*Wv9gcDNLYBNZ zPb+Xu>QziIPbBGAc5;g5Z=)1+UzTIpVhxuRo^4S8tS*&Igvv= zYj9dR7i0ejTPtuoN{DtiAPHbVUvR7&_)VGV-y9SEselgu~I2Gy__ND>%_TmgLbTCqWu=G6Yf+^Gnis!4o7|ydk^Ml!xw$8c^q&4weaDj=~-4wIR&<}~LGYAQP~h)J3^X(r9| zB89O=g;-qeM(<)Z$bxgIx4dWCEg@z6l4m&wNU!E-Z;e$ybG$hC3a+S1g`7~M+(iD+ z+i#A6lm#8D@>B8--)H$o$;sny$BNEt{Bb!Y$72#rr8pJmche~BQ2JPCC+zu?DVe2d z%vpl;59J^4)3amANt^mo$?-p=FXXp9amAABTXe3rPM?;Rbj*|L17gC|Oq`sR%O|x; zD_N_yzYeOgB$3)>5b{{C=tj-yT?V>ARoJN@5o`@Z*qf#`HgToIszi}$<|H~Blc>9+ z+t|$QhSbG8X@=6>s*%u*N>O zC7{UeII2W4o+L*|BUrF2Glu2lxIVEBvC#%7R~{@|;MFivc!-O+hUgz^Y;*O<7zwdi zY?Gh?(!Y>C+nVTkOfDb>S<=@yQ+4}&ool&&cFsKvVs&IJ9wnFFYi+~{r-CXkF= z+>#~F7CaM%YGa3iVh)(9(gs!JDr*Q2K5baZQ^Mjr6{hd(T9ka2Ci7^4WQ^bMVV6@S zqBO1i|2K+3(RLk8V~Or*<;@!tMc}oh@nx(C50w0Ue^--snFsm;pDHlAA?VQYNF6#l4|RmYcoEF ztL?=yN$%$X&ak;LcCExk-+BDnh$^y&el=D{a$ayhe-3+7ub~b3xU~Q!X6nh5++nhw zG-gYhf?X*atTR|O#n+{rjd)&(*;SUVcve7Kl)zF!^r7oHkgdvf#H-hD-@H41`orbeN6@ba z6cLR;4@lmv54X8Gl4FI{5zHN^AH^Yk<%BTE)Ur%~m+M}bU^TI7HY*wv(3I^2l}l`j zA#c)F*am1TMKZ?~serLl(MX;6K%+h02y9H=8@&ME8`}VqugQDk7En*#8)tWfJ0|bV zO|T*FX87=rd2=IU^4{9k5ajRJ82n@H*5a7Fx5ZkqY8gWvx{X6ov7qhm11?P4y?}r0 z$NLdiDRQ<_Sy}4$gdF2saU2E){SUQ!N?0iv#t#ayi^; zna~`nEI4XLHWpE`=54cXqZO)P)EBg+u{rKDNH?0Cm0<&>WhG8!6D6rMCSkN?J)&&T zd(xE;!L9iaa0m)ed0`{f(En+bd0XZ6YQ9l@ZBtWFZHuD1QE_ao4=QPA2sbL9-IPon z+)ip{4|URpEfmUj_^3(tRTdj3vnJ4YQ49ORk&#dLvlx)Vp{1WHqwTX0LsKP{U(LUa z+A;(+RbF4+RANAU;tmLS*=lJ~&#u@mOTAa~{nrow!xwgv3~DQ~&aG+>IuR%5EPr#A zycNRnT6#t0>@^0q+XAi(FT7zALcYp)0AhNGTdCDVwBr_58NZCubzYSyHF?9Ifu6ZC z!ltB&hHog1IfcjLM4Rvc1Ki9H_t>gd$RnjV2d4)>TvbOYd5brta*I%=%dp7{ zj^5xbO_fRmh=ajY9@HGm29(D}^$KD@$)_nvp;Su6^RL(C_jNmj=BByMS8-JIJE7!R z4VD$TFlZ<)hKPMMwy=Oeq*)NY9=V03u+U^q^-fC!q zI>vGTuyF!eG4oM_gN3AoCsw+tM}2eJJa(+0s)J;EN!Ng_qJqWIzwtO@zvH)YW|9`^ zkE@lsiGe)ATtVzc*?KF$N7?FCaE}W710rjL?>uORKy`zKqWq=md>33Tj!?ZqijyD% zL0~%C4L0L69!oj=G-RtXQd_;AkrynufOn4IHa&bq)S_ge z@nFeZE$2n9&C^Wdux%C<*Z%=UCzfxw1_lLjYmFQcFpSugyyp;BhDTz>&ngNWc#ctc zvmH@3!=JnDbxAxHd{+b&fIomBkUu+j}6aIB%W9C{JEA21oak?;cg(CcDLxU6jssQ|c+@}IqyiD@~IW-@Csy48%tDk(8M{zw)u}-fDoz3zg zTmgPPBHyUuZPEP-j;g?pJHvKU5i^iPfeOziEMBBpRGcrxc2|^;kQY2#M)2k_?5Aa% zuuoA=Vm9M(F5DiAbki}HC;)ODX5xypM&G6Wg5yCvd?zn-$C1dRe~=`#lFV)32@}T+ z0ApDaV=i@YAU42HJ9oT8{~Arh{UC2#!Br-3c-Uy1&uIXD*l4?d!(JUifsjH5`>L?s%}SkQfW4mo znyJv$okXet1iJpRC$_t^QSjwykySULC6D}y58VhJsoHDPzZB{;V{EGB z*k9DG9}U$5{SgLoEljAMtU`>VQO8)uD<81O@Nf_Q`idRp>r*@JjX`D}aFno`dXpxq!VN@vq8K}c5gDOcx&(B55Xtc@TRwoVWJ)e?f z!%2|`?cs{I9HaaP_QS9i?v24B($sAp6u}(H7MuDcB-=mF)0o#4K)=*)NY19v{L~o}ov0qQ zHe!G*T1Vp4Flp<-kSbO7w6;{2S{s?=76FFj!lwfN+B46YT<;Sh7idEReC$V|A$ zNm*AL$+bwIi_*hPfbIt=GXbRG!#!SaUyU{%9Xl^=kQ9#F1ksYk1n)DSWi=7&C+(Xu+#2KBrNLQWNr2h(RKo4q9of_^x}&oZ>%7G(6>~S;xpm8a z_-VB9?mVD&j+#$>t;%D&SLg8V@vtrp$U}lhP{fL^ivQzyae=x5WQ8Yuo4%mcDcWWCDpo)b8wcg_Xo3H$%-y$g36$#F3HS9+azF_1v;Vas+v zQH)j(uVU>=k+@msa`}-%U_j0an1N>oB4Cj}=>CrT$L^_DcXdw>2x-?}l5>(AuZW)R z>grc@bv-Y^q$)MwJye0^UN|dPS@RTty{yVPzKD=wP<8x0GGwobgam5pQhWGW7Lb#p z9sv96vkc64;Go)8Ls(x0d$>A`H~!C9<8{z@tuqe62A@4wAS?vO&BV}q5Jmc76q^UJ z(mqo&jKzq{!d<3KS{x*i7K2!qeI@EAFpo{L1EFf*S?Bg4eS3&6xoSJ0k?WEb z*_W+l7R>?w9eGaS(%Cn`qB+1_v}pE+tARNHDV6te%^%nBu|?!Ct6ipco4F*cXuvgu zaWL#P&pBGf2=PAhf&iZ9(>0vE>z~4echSZqlkzycML~u;0=- zVfU(jxtz_O<<)qmJTO{0_*!Fv|Mr9QG+`w~Kv&8lm9k=@t03T$@;x+-frLbUk@_!+ zNep&a8!m2Ro7?IZ8* zuoDANawsHDHue7x=wA2j`~7~=4Dh9cT3h%p5X6KXc|hkxzHadQ%se)M(Cj)#gAeE0 zXJZS(*I8+w4e)cGPl8u6KPIkoNG@A?$xi1KKWJ7$`qmuNSnsPh@OZvR=J`ZFf3deY zN6u`ks}WW8Il>*zN?3xskhJ`|#{o?4Ott6O~}w73DiTFvGEgq^ct zS5*IqZE@co*f7~oj^eXT+WzGw1g|Y67)ssAgBgsE1-88O`aw2>>|WElUe2?L_~sX) zyC|zkAkLvafOn-DR_j3@0=AB_=0-R^N~oKz+^47lB%d`|d0xwaKvs*iYGC8*9Ku+rB|HoQnm*ya9SA7hG5crciI>YcD<(TT zG2cIC%+YHW+CKKN7K*`zWYnRUBRR(O-Om<)%ZA!{cubx4KxKkng5?7Ksju^CgMTal zD*Ux9sPGIV?g->C>eq#C2CwtFf$({cPneFKmj${6FYD`LF!cb71>_-IXaHBKTpTBn z^7qhx{0m}vO!v3j5tD3|HQBRrStuTrJFmNX|AEHYg{5~zep{9wSbB%YfZUrzJ2Zjw zW2$Uke$3?DBr?-o6OC}~WcTs(7G;x9*A#VvC)PZDdGg|&>iRmZ%_Ryw;K+bYqpSg* za0DxnK}dYm;{iYD*-$ODNwVS9P_Nd&WX*WkCzE@0aknvMx-8iV$ER+Gp?M4`EP!jY zgBZ0oOLw4%7EprdfGL?TsT|J12CDhlS-$zjLuts?d=}1Om$@%n*pjW2*wqReJ%QUB zD7(~YezmOV=D=_wa^RQqjEm7mXQ0#|BgNVYh9h$-f1hbSP9%)#G!Lg`^&%Z#C+yAp z#P^_P2fQP@`e5v;t;(!rp-rO!hOwfWQ3lNS%m;e-X%;3v72T7;(;;?Yo}r>ueM5xz zw9Zs;9v7L%RqtGQJ6EN17**Z4Ac^Ia?QBnJ0?)eQ17ZM2 zHdv*tO!pi=0EDJi?x{o>(1gno4j?EHnz~pnIFwJ?G+?Ye(XKp6y#)6dy3YZk%$}*6 z7WctpTG+sMf&j_ruT% zuBJ^6vbSLn+mIBxUwzV`_Okx0XE7$g!YjE`@C*=sz%aeA8`SmfEgD9KfFRFgd`b1R z5~j`?GQotyi(fl}j^MWlM@GR}F>_CyNdW242ocQzzss6*K>CjtWEFN#Xk;t4auUF{ z*a~b510zQLgpJ9$W;0fJgtm_=lJ7n8u~t0FvS>I@#3Em1v-kPml}M1ju4l^e1Bzaz z^L*A3slqk^!+V2H8v++f7Aq`sP`o_^gb(d{O?;Ba_I;62(I>)xXJ$NqG}SdTbf)3IJiG+P1jz#pc($YpI2)uc5*aM}ug>kdwau z06e*_%BGoR6mA3TjWE(*2`aD!QhJ$>DS#kheTu3w7bg&2e`t-!TwywHmKTCAVAz^lEn!7c2P3kOUxz=oe07N@ce-!6P2)v4uMp9X6nzKYYP;Mj*Wp#EAMYLa>1fi z9+)KLHrj(y!MGyP2N6FNh|9NE3F++f?6O>9pdfFvz}PP)*(_aOm`(yb;kFwVeB)vp z>>%*97-^Xc=6Ce8Ig%H{o{3n zo)Jfea2vue@AD_r;-m6@o)^z0n)f_i@!xl@@m1FRP-oRQV8~Y|eJ=)}YpiY49 zCHrV?F-Vr{_S48mhc=gBmQ1P5e?&>|lJx#FxX6$>h-!G%8oQOR)U(quWbo{l1pYQ0F^-7SzZn z`fcY`*(=(XgQfC&13mRSW?5;S$vRyo$U{=b6ACc@Rr>B z!kw6|`aYgtz9+xUH}6SS-~3}Y9(3~Xo^AJS9@%z6?De+GiV2@1z45@n1`9iw-uAT- zHi#Gza4*=l%>u&>UrQKWOj<|Qs~kRed<{SRSm2*ZPD=&%h1oH3ui*9J+mV0bJM(Tk zhYIK(EwSon)GywJ-i7;V#W&wtZa~$_y9U`0ExVy_65YX=6)GnQ4!R*oF{mk}I9+k^ z8f&k^+H0)6wzcJf!B0_*l?oPu7rXmHQZf4b@ZLm1ycQU4z`+>8aLCZz;`meXQ}a^; z0lEB&>B_4JSjQ@^1>*W1h--o9=HbxO$Z&3F-Du#3>{(6n=vvldZ(l(S@*f7`_`ftl~FSs+#MI(>tW;H`SqeePhV%{{#V>Gjy~7ikU87CCpdNwtsu zyYe!t8uK`JJ*1UH?bByEivC!wP#?U3cBSvJvnI}I(z&(E#}NwTwptHs^mo#plQY|{tk41!36&M5})#2gNm+Cq`^+o8XEksHHV!5wj5t{;le>u&#i%?v(Bc0 z#s(W}6dh{EYIZ=_eze=HYUk>{&x@?RR!EP=Wt~7PrriAi`8UfZ+St-E-8LL_yj#ZJ z_Kr~un#e(Wv09X|NoS{N;(DX>9mu;sh)uBe`|Rw#6D8b{)r>-;`z&by8oUg_2x@Qm z$Y0YKx)8$wQ4ZEOf{w1;US@Dthz;@yj}frq8xehoAVESCoqV7_F<^dMeE?dEA4jHR z!+V<|hFdT-F+AuXP#$rAAJGMV?}AzGB7w)|aPNmf8_I|0Txz@ulJ(fk7~@Yvj(Ofn1yfzos#i>w zmd{}fKbgw<`j{*C=cW5Ib-_2N&8a-W{eRCkepR&qaX@VI zXv2iC9UDz&g#}ZpX9_~sl3ZoYw_ptT?3XRg1~A(%Q51-c??``a*KFGf^Q`cN9)(jk ztkY%*c?1(6Z^KDieaMPrZ@AwdUS}(Hz(^{^LPcC*vd>?EvA`PsbBR6~KjxDL4fX+< zB^Vv|8cKoMJF{{hTz+a#M8`INW`CyR4_6q_f{M=KG1R~Y;;9qcv-&w<;wQ34`8lk! zCh1u*zq5#DI}ksWr!f=I>mP7@(pMoOJ=@Q9l*Q@}NNx3=MM?(ZldZlob? zHRW}5&h?UPn1rTEi#iX$q?oo&VQ*oLwCc!h)!$3fWM`W_uu;g+B64d`U4ZKA@+JnR z9{Jj=VEx=-prJy>z@q6XYjdT`W1EPeIWHaSReA&cP2mliKtR&u^LaMO(3<^lp4QI*X6R=k`&LdvfAv+rhJ=DCOBf{jj@n2cZPv_?pX}k z637)?mQ4dY&6SYp&|Z8fax>*cGkXS32W+wZUAnM7m9L6sHspNu5Co%n!WJ6(w$|U1 zSqX|CXK(CsKZz28QOp1Y(~nao;5=;3wCLw$FiX%Ok>az!<24l;^_u$m>;XVYD#lm z&L(cQ$>w;HPceIEBL)*wv;nT;s;?9HG;|<5J(hwj=>-rAV;-27c0WO<#N1PWS+4M} z>=YL7XJ{RJP3TzN=scp6yk5-GwbXNV0kA!8CBpw5c`-uwtwy`{WmS7DxMIR7hn0P) z>^^uvxlE)V=-|Pwks2e@1J42H+%A%cuGv9fw0vyWVTR$ll*Fw_$UO%fn?ML*2?>UHlgCXPp;~Mz>@wtaV|Sgo%-}K`leMx#%U{Sl z32jYIF-O z%z-RYZD)+Ur$45%p*BRsYR*|pi(YqkiNWC2&P+Xr-xL&~%FOlhN+K)Phv?f-kKxIh zPxG-Ij~`xQo~~ePYYQ_Q`5OB<-8&;v&>xuKi-##VxDQ?UBxi~xJv@eZK);8ZR!W|j z{p{iXBhN-lumo3ChkQ@lJ;|T48sl^}UV;mObW+)4|M$ZX8f;F%%~o80x1 z7gGpXxkl?{bl+U2v)S5wpMF0yZ^7CHI!V9B9S+gM=gYYStA0*lJK;mRYJaeOU~F*= zG^oOUI@SXt6%Wn(QgYvzn~V*$p;HXSis-@SN^MGBmKjPfwzsBynXj@5da0)v_o1Ac zgS~brQoAh0a{in@9#MCRtduA_{f!D%xjXx!ptRw|sl~t??DYp`&n+hP;uyeBvf&2t z867E%2JyMoRqhTwA8EEw;_e1ScZA|J>Pm44dK?-vU}{T8c|f|}HeGPD@+!p;^q+Uh zsb>Fs(cOR1spV93`a7Bn*Ow75&+JQ|m z%`4EJ+?2f0h`wL)^^8;De4;JCO4e5-=G5)0&-1w#$LKx)X1 z%`|0q*Swkn9Ve%JA^NlYLuNob$Q%h`GBDHFT=)#uO=gOW4iM~-;NnE14OBbX{RbjS zwdd4sQ_h)?`!g+&C%O`U%of81NvLChS}$B|*^0p0dYaX6yon^5D{zx%$62vn-0&vz z?Tkeq_{nYVJ5MQyZLD=EK2vGUyWFi&+=G^{+X;Kn3RcP7>51jZdCKXuhRE<*7|nha ze&J*c-W5y*Hp^_ zGXq+H*18lDOI_v7_3{#pN;#^*F71b(>)pk2HrxIEqep*GO>^+b{@rkID1zPx%o*W~ z)gaLX)OvPq$FqE47py(qPbU+)C$B2li|J%Sz85gNK=i9@vK))0Em&FO05xm287%}$ zGCg}Luc~~4_Oaka3n?#ZsSDu^EoG1GHnOWljnzo`kxZ)e=1qYU_q58=pb31%qY{+E zOua_xI5L0oO1XpNeB7)YUxb+rhnk+26aoN+G59(n1#c$hiaOieZ4AjK` z2z)0>6iBszjBw2ica;?r2muBc`g}QSay+&q@*Chgj#yvw#yXl4uUi|C9t^Euz$(@{ zWP)l!3z(HpcWUZ?4obxBSbU6aFI8FBPx+&$UaT+Ob$Rm|5C^lhNd+6oU$jdumvyPG zF4N@T(W8NJ{{f?@ey`QUPWZtf7E{Y!s#UpcGQL)aOsI`hsJkD;e8k%UnQS%Fy7*0v zsoobiN3yU1=MH6Sz(;iHw&ObNui&pCI)!oWRmv>gqYOW-ub5_pK00N#Y`{RrjShNt z2WjPcOovXh^gOMv12C|Z-*kNha@@ODAB|Jgp^N6}+X{r;R-d*s3<&mcuVdb}ouUBR zAkf;08pN}b*{FM&l~pU?kfdD2WY!$^^i9P)?dNH7I_y#Ie74%@m4|lXBX9yuY5;^( zr<);o%z4nB);DM!#Ae_~YUruQ0;6%2fwd4g!S@ea=~-!ekZn)AK|5r5BzyKS*90w6du&NDO;{0r@ zB_udZ&ee_{m~%K&c~+^^-XJY?(X3Ps_(N48Fl7V90dfO-1N{Hte!u5ccem$#RmW24 zpZ@TNKX_lPD&R=W2INEbF&}5>tNsqK2FFXzUyH<-|7P9OVwN_*U4fCn^Pr`*yG6Je z1rKR=nAupqHqAX|*M)bn<9(TwvoC7-SHhQh=4-s^@=dGM8c1J-NzB#teH_tDSulTv&m5K&zbdS0 z7IKl1WdTugljg>78jAJWK8-1BAukxaOs;aDB zlm&!Lk2I=Ti5#Uy#2U5$;)4dBV{LFC@py_>h#VoPep8&33s=)4FU&t`(&?=zg)MWm zRNL9(z3@}h;sI`jN5E?&s3PA^=~g|r-VN713Bn29576?A+s)}aco1?T$P^;|PgDpotG#VXlNK0$j)3ms zJB>l0c>_Ew;RunL!*n?lLx&QW3rwNOhzv-vU^!nBqM>+ILQGW40))ZR!7G(fvNkv6 zay9{R#<*PM5S|88-cbvNz;!@j(14Ved~k;5o3-GHtr)x=CGafJNs9Rk8p<7!j>lOI zlUW)}dpWxSfy#1$R!V6jNHVM!s}#(yM_%DiP5Azn+j^K*dnzP^_ALP!&` z?h*qxr#L}eVZ{Vn7CA*bqYXt^p77SSU@$!*Y&#XUI)a73elcG(Yfs*2y1!|HrbL34ZOU|CmCXxi?0@Of4z3dw;doPH`W-9+WJ-58>pQ&DL- zRSJ`wy!P6G`E_34>7^A&xCCPkWoQ5^ou8_~oOwcOaT#(rpTZ!|l-T;F${QER-pa1E zeD=iQ92;6%!>l)1wM%#b)d9I|T9`@6o08}(4%K@6!MWkn4I{FWT0+qqhYqXnF=BLo z1_A4pSsYu%c{6m_uFHGQOSXIIjHB-- zn6uI)>P>*?*4k+Ru2tXel%@aSbQnKhl7~YOr=NqVBQw@|*Ghp4u#OeU8Q+GTby5k* z8610;2kPhD2j-v7&)@#=?#1~zSj2)Mxm6!iMwV>_w~*cdXX!pMB0WLrDS+>iQA{qX z-V;5sS>k5{m5!oP(EI(VV1fqbv_m#Hh`LP-BHHz{{$V?)J9L1mO63FM;tE`-74OrlWV%w*bCt>@5@m(Rc2Ik*?c>3<-#XJ1_d^F5)rT49x4z6+E?u%B^W05fZzy?;-|bc=ft=CB-+ldE=K zWH}_`Aq4YYSprP5kJ$|9`*2?VJ)h0eVOd@6X2s4A?{_EVxZeFSyWD;D{{1dM*d{t% zQ@(W3^`X(oZZR!oMTEfG%8M-srI_HL-|>wEGyRr;R^G|JA2!3o!2HKX{h%oQpatzy z#I}cAmjo_SnSVuUTSO(izxQF<4)VW6SigCef|UoHEy{P^ti)ZIPF-GHJtL{x!E-zj zAiV3!=!O-p#^T<>iuzdz0p%Jm(;rnBSvPPU-aK11s7p3S*x4!7Idk4WwuX~+cC-Qe z=4Lh2qhz<{A({yAU34|3Y)1UeiH=b!ZDBu=p|}7b^cya8snwD@a~)Y3Btj?GBvE0; z`c}O|Zdvf=>VZ5Yp%%APa(dQ3J=?I%ySpZ3)bBABw7JGgkYfB2QJ#`dd^MOX3dtvNkY@u8^_5*oPO;Sal6VwhMt z*QTCNg(FnZ3AUF&r&$f_^kZftGebdGmolx&rrpy?b!J&1*?VO9T)1p%nL9_epVgnU zOeGX-uJK?8`xPQf)=f4!iGFn|EL2~Swh9nBH2K4aTBCud#>0{HR@U(42YZmjIsf(!tn03fF=8xG>$*h{y~JT*70Za7(X1EpVc~|lF@AkX?6Ou ze);^8wUqVLowQap{McGsRUv$Geda1_NSmHN!D$8^L0PE-jR*B={2FKaYAgoNlrDjW zOkbZw&#`uv^^O`g^3R%0M1|Ms)%Y|&JM(SGuf~!+Yi~dh`uE*^VLk^GQh*T?q)`Li zopXUmAqR>{izeSmXF0_=y__v8FBkYVh8stQlm3>MoyV~fWMElUA6^aQ1sD+h%?=BE zjDpC?Cvmj5OO1dHQBj#7&YT8eK#&|AWfMj(l$KaBw6vt85FIZokQ;`&P(|dg)7ez` zBpT>f7<2d7xdl=2F8D2A__7h-61<{V4<)NfA`@$&Ld2*LJIFfG!uX+U(~5cxX=!L{ zfcsj7r08SXnfwmZ*bs}7P|f3!`S#?y*Hp$@p#dDI<8EF?KNH5y3h4kr+my1dSrLN? zYye|lv6`2R_Xqz#rWpJbG`nQ9me*$kl2!mWfkwJg*|>PE9Q?FrC~s`dO1i zW``>67Uj;e&UVPMZ-*`Rf?IGEU?>K@LqeM#W_0vA|mDj(J`X2Ky(~}4r{bS(20qa zA6gDb<*RvmCHnKO5Ogh)dZzQY2J}sekW_&WSpxgl|AxcQk}93}<*+>wAsYF>?9h1B z#l$5{DzQk_ksq3P*-jM!)1vQ4js{}G!G)HV55+^gw2zNArU8YX&H+a=G23~`Bq=_7fp+Qrk@#95WjW4W2dpWhxF8;PmC*bloezvS& zu`UdGN9B!p17_eijJi7V*RM%6N4+|?`gArgAu|MT{ULCk`+tDsz0xW1qKm2oAFbL! zgZ%0r^Lk0Ddj^M7RG|*BtXM$In&s?cUM_1KF*05Bkj@LTNSUzW(?LRfsGAE~jf){T zhtr#Qk~L`#?jhjkhQ6%jY*yaDTjlM$+RghmE^v8WFSC00(W8I);}^C2)1yDR*c9$^ zgsgJ(#{-(xLv1MNzV3LfY$d)zCBOymP4iG`C19fhtgy|G_ccl!1@L<}BLwL7_u9vT z56@;S)&Uk>jkd?a(nzyo$4KXv`|{ZmB%@}>fTD)}l6d(Mhz~8k1aY+qqE!vG?oI)w z(R;W7J%adf6J|ReW)C-E_Rz!3JTxK1?P*ufyYapfR>`~hcmw0=zW?`kC;R6ImS!p` zOYFY!c8YKY;|7PT=rL3qm;*O@f7j%{(`mtczN7XG>(T#OvmKwc z&ziK3Ictv#JzPhzo?G&b@X2@2b|e(yL*0N8T5^rHzp|8sVw%rpi3_UgJI#p2gA;S0 zhzH&Ilfbqv)aq2rOtMx|LQi^PL7WhLduHPXWdfd(1}l;ZhW>^(TUIx^Qd(sx*NFm| zr`1(nm>r1oSKee3F4#&hlh-KJd{sbLjl>GAN6Kt1#ef^uc8q`@x1^hl#gY60;=SP` z40dP{6pO>WrVu0`7?L+R#|x@Gv!btX?BI(@v-9=Wgx_$5%DyZeVyf>Q=|X*fOy4WE zE3y^He28kT1xiycB0$yxgyU8Sl+Nr15Q_yTa zW5ODY{*JA$^&$Bp=^W3p*lt8>6fIrJwl-OHlPwn6~?j@be1oU zZL)OQ#N{MAZrNesqf20hhHr|vQ5VCN7zq#8f$`KFeThMiJkKYSSr#TundcME`D+sC zZwMq)AY;<{;ohO6LEN>p9N4iBEdh>J3ovxH77j;>r+_-qufBrG@`xWpbZBJHd6^rCPd;5e2v9gK6a(^rRx*LZMeK-p06Y{Xj9F7Kr+ z44koO2x_3sPy~6!7&k7$`)VGSoCRQZlb;e2^zeWfSzmhwxZVUX#d#8ot zD$&L;FBtvCAE}fI09()rOA_mUffYbcRVZm0@LU z4|wMe@q`8+GLbIa-V*k}SXACPb!4>f%Nue>d-Y;}-_*+mQWS_fdkH}r!OngGzJzQR z21)@Cf7|wKECWb=hvx9L*oAAC9t_)tW<2FeqSl%R=-Rj}rnB_wisbLluB#G!xnAZ~ zHZ4~J1DOp6D6M~=PSYv}3$^AtTU!u-6j-&T(`>fJK+-N?+h^OIKYjaZSB>PKzNyNa zI;+k>qnJ$7k^R8e#j^z~XExSCI6L~8*CwmrO=lB(xr%5IgtcfMi1qti zt+wG`fyPYPsxf83S~;>c>R@LoOYgR%sT6b18rFNB2%G3F8L~&5kz#ZgEw`QdIUVV| zz|aNObQhzR9MfP&<`n)t^9)X4o2U~aG4$Zo4NossPHT+*V!fC(w!SRl7H5Gm_)x8V zixZ&*7PE!WSQN);EqrxAA-*rMf;P*xmy?9d(pILyap28mYlh+H$sz{kL;=yapUhUv zNW!NjVf9#u{4Ul!=3;zR&T;Fwu=M>!q zZMP5ulP-Mt89Yi?)F)U-b3arUx>8^jfDOZNO*cRt#EM`fR>9mkB#ng|72eq4u*^eq z6ZZa&uXez!JvQRNB7@rqr{i0!%#LsG{vi@FaB#{+_W;BF@=lJi+IiayOPWUE4cY~J z1G97gYPsHd9I@>eI|Hpai#9Zi_0a|IS_&uF5r$B?=}Mr5rhJ~yDJ5uUu*FU8yV?^q z(txb0BTmUSp!2{vN0Z=gd&g!JOlwkfufMV+!g~Gc`xocmzIgTLZ%@pT+5JBW#R|Jk ze)?(hFgYIm^wSXj>L2%$#p*Vj-~P6L-2dlYn=la@0yh&&I_!hFV zE6!2oY8+L*;W6zPr#MT3w=O1e!R?Pxrhas z7Z=EGhiBY}qKChkqED-u~|wn27d|kA4gP><|Bt&3k05)9wU*+)=+ zfVAdgCIg6gs8C!VsG|q$2AW_e44Vb0mSL_Duyz3}7}tx@77QzvAIXRBOdzrb>{}+-=w7F?g(Lh3a)Lb!U0`Gj@y*S&lk`u=|ItIJCCz zv4oz14_qCk?d77@ei0cuK3KSZDsX`&d-fRHWByn_EDioVg^y=^N8^v0iq34fqLB}P zK1;6gq;Egycdi6&Di`o-f#K-GParTxqB|W43=0PxiG*8aE$7F`jl{He zZ=6?Cn}ue8;hVhFQIOFNA%MKHEHYBpJTR!58UV#h3x+;GNv?Rrs(4@^YQ^}h&R@1H zFus}DBb3a_?3y(t(Yr1y$j~#PtFwl{HiQjk&dR3EF0+@#M5R86Tv(hFKtkCiD0X5| z8#NjryuQ9tBojycN`aYZ9U+{aTjH+#?5Z8dZvcGVVnnIrIhil!mX}lv_<>UR_Ex>S z{ueE|yoA}`CaLpzK1(ZlE|2S)9pHA@B;=Rv4d}{kk@_F8N4&Mw-KzB^X5Kv-^m9+W zi#~J3nf;9}Jb&AA-A{XrBrtA*CS?&2MBOj?c=p+=FZ-Ss9@l$OWjnAu81@dOuDire z{Vz#~k%WO5XtPjyd#014_tSzO2b-nO&e`xV^Q7*V5cEKkm%fqb3Do5qrM&!kDAwoj zH_9X);-8h((!ej~&8ZftM&K_`A;Md=y!^Qps2m;~HOFIOuUkrJ!S4EQ$y!}1Jh9D9w^6tWdyeu6W=$?4kazFiwUR3m%UsUel-}elAO7O)@t0L*W zqSvGZ0|Qw6w$3IP>s&xWP^+JQ(-V2MAnk{VzSDs)`~d0_KD}d<^jQs)qk0XT>Oz8{ zw_l=daIU@rsl?>;R2AsBFlt=S5D7Qm9$OZuc3L#-@%BhWd3}Zyw z01l{3`OfPm0*8|T(6wh{gBBA{e_*8eyvAHjc)x;sAH%(XqfBE-tE(lr zMOx^bboeqGmve~=o!!vLg0VtA&n+?J=?L*l8<_Y>wz}XBH}*Fz&5otKrOo|bQ2HrU zeOy9TN)#Y1vA`O}S`b4FFa@Cm%#QgHavfi0#7~sw0xgX%fF{remC&lT&2ZaWmxWjf z?TC>om*2hbEkp~xbdjS@qz9%_rg~(&&bHM zRGFDT)^Ho1l~Tvro@3*JV6_I9g#QG0*%Q5KffKhnyP1p69betIx0f;`5% z=D-&cWeY1k)Gx6CXklGsqoXGpL0CAqg&{K0p5YtPJcNe&0^?Q1Ns;an9LtVPt4rAT z<<`VGb9K|zfXCODThxEMVV)!KOy^_AN({KG7AX+&h(5aW!&n#b-Psk^2s>sNkDVxz zDB_dE>w}WDSi(6nC;gE*Is9Cx1M}9FoV2=l8^C`HQqTMP2!TjPW52+Ej{9+}{ftu{ zyuJnG)PcJXf~Yv##^Awa@DyrKi}f2$V-YCQF4H;;`m6MK-(^kudGUzf(T!M9cYn#& z16}$Ih?Q6JwklUt=ebRhVWTtq#S~+iX2}8K0)(Ri8!OdjG0m@rh@stqBV>21##3d;lN(mnUoAAPjrW`Zs27 zxU4D7tSmoZQ{h$fLUU0ll=Iac*)(5Sc=qQ#AUup9yTW^o6{TCysC7KQ-=<_gLyhHw zcP(Yj35B8GvB^pixhu*RtCKQ7v4jI5+th_waO&*|P-VBs^( zi*)wRE!mM?zuQ}GcNo0uomc^QHOtI6W=+W*&V^;}*`V+}PF0~Z-SK@5r+nm74^TV3 zd*WWpr|;ME%W`IeM4hBpXCu?28L$~J6?d(&A)L#6)4x*c#ykpVWDrY+ihs!$JJ};Q z?~-<%bM}l3<-{1dZGfv1Y^~&!GlC3=Al((ITBw`kA zFgyqKm2QA_C#cm5TG*Z4(FzwvBsc zM`ZUjDzCOmPeCVF&JW~fc*}bMRd#x7@OGAb7yWIA#0<(+*1WkXWNqCA?0gZP&gzmZ zIWE`I>N>4etH?A&VS1x&&&j)NI@^SjxL=*yb!SMQKjgPn*_1%h-b^FNtFOsMG<8Lb z)Yj<0$;*q*Q+J)#TW+SS49I`|vMT3KXEP!Z+_XQG0By+^PL)~;NQgp0`simO&aFdH z-V}hHAoN+-Z;Nid-TACL&L;~{d`SixyO&i;k4V{iTmml5VcC(p1d_fJPG~}iVGgmj z{Y@`*AYCl73aFNO_)Do}gx*ooXOJ0sygA*sU2%`oBFd^VehGQ_2~iDPzcsu<%L*)hAkynL%rAapnZ?j(Q|Yd>i{S0O#2h4HNJJvR*^cFlt$K5U4vv53$yygN{lX*M+ zo(ow!&9!;?e|RVh`*wu7ff-sn9XPbpVxHu8QY)L~@6R+EuA z0Rg#01stBYz5)-O7%X-hz~9S2M!*mKoRUt^a8H;2wLIjnz&qmTJL)g^wfA4d`+;m> zoaG<0>Q~?bWwpHqu7m%<%%9w6>Ie?g+3YXs9s}b#VZMMl;uA&ij?Jf58azV+n58Pa zGb1N~cYsItGoQM*{}v1~HHmRPO0 z(t%11sB7550c5Q}0-`^25vYuCWD&&-R~gy%a^b51DfIZO8k|E+zSZwlTPJ}|6c`|3 zdeCC*8|kTj<@(aVY_|x@&5i|Si#)B7Gjsk+w&svF(|qMFFz`}wug{|=EPbFzCGf{X zEiLDCkt0bM%a-|BHmTn)FJ&K5KdmR2Z?7NNTw`P>Fmgth;&hTOApd+1gF+dTM5(Pb zJ(65Gx3{dtMZBuz7(GU+@XFXjbfx)3zOD-{IX z0Xe?CWxH?~x=HU^Nmi3XSwM8=rGBy{1PZMj@5x!uZZaGjk`ym5je2bpO zmUbsHlf>7kDG$9=&-p4kw~X$&<8*!QUj4YUFM4ZQAro`nW+lmYN%N9CXYxtEd0h;C zdoJDP)y$2i32cWS8eqr_1{DXA8(DUU<^TLBR=#b6RZ)j&mBQYrQM4l;e@lgee#4`# zVYxw4O0f2ZW8)&Lauro}y}Xo~72ei)6X5SZh#2+A#(C_VB=Bw#U}&b!@)6twWANh{=0(!mdD82Hx#Z3hsOEUbJIYXu{ic(Nl2ht)DU+DQ z78FukcxQmY5pSg+e%AK<5rY1=ghJMOFt$nU1_cw}>r}FK%OI$p?weLgMA`#$u2^fq z=`*(@o!{tA^siVJCUtHykIzUxWNVKH2xF-IdIUMpI0~epGvQKtM>68Fhz7e>PuOVy zC}z#&UaXHzl8+KG63%} z>9oy0pMI5*5*Qe0Jd=^ZkhxKKvwQ&V{)kLUfp^DBfZj-~Fr|jr?3?43VGNrx4WMpc z3sZc)Ih{;clf$ukMj&^6Y!M=9GQkq{dno1Z7@ceQvU{;Nt%i1)B)gMx>Y)-u`>c7o zW#(bpWsY^0Dw4Un(^h8*y*&oq-t>@CFKLd5*YSkYS?3jG%A>=GtJOKF`R2K5Y;X z&4Fttw*T%(_&G=&-R9LgVhdSiW9$z#Hd`=38z*IV*Vy*Tx?B?bxS|223<@0tCi!%l z;g)Q*Hh6Y%yZc=2AAKXG3RCmDaBK>u=6I9|raxv7q zMMO~5UR^EZ;Uow($MlN@45`U?xQB2n0QOfH_^0Clp{z-c5Y};rQRVB9e+S( zb!rChT7pMGU^;o_qpGlg+u=$^KNrr%bW z#om(25U~;SNnP_W6sm|d3qC(QDW!fU09j94PX)L~*@7XjZIB#{NN1LdN!n<;)tFC* zo_|JH96!5daMpq>I_Y9iHu7Un)*ah3W?QfZcl z`evja0duZ4G4oWV;@%(z&??97H&W!Su2qViJ~*xA(U0pvY|h)9E3rA?XzR1AxcNg) zH13z>ON6n_>4$86_Qg|r|A05xdIh9GZ6%J|;#oY|bM6H@iPUtIqN`(hY)463-Sz5h zL+f6)7)v0*dHRQ2F085obi15-(Q9bMMPBd$F0!w{DLSp18V-NbJMZ=Tk;e(#2VGZc zaD{ednK(yRZo=ky+N6+NFP*&~rz{YiXHCi>3BbqXF{Rltx29K*Q%JMfW80z>>V=dB z$Kb`h9hb|ZY2`0r`BRSlqDNTPq>3Z^M7Le9>Y=ddImgU8l^o)IDzDpN7c--uEy~7yYs1Zj@ zmO-*Ra9@8*>5Ia|9h8Tq<0B?O>G-Az#mMr2vBV+tsX%+ap!m+Fy{5=vO=;ehm*)K< zE5=y`KJPW0CrAWPlpo1)9nSW3UYiBv2$s>JEP##y&o#q^ScRkAT>|5vVDj9wNN4LN zAJ@AyWA!dN#S@P8@Vc4LtV;3(y0kMqU*Ze4#t4iH;5UEz4J`E{oBZ?}i-4kjl4lW+2v)Xb8Gv4n*K>f4&^;*RHje1r;o&3DSH)3%G5y*fNWCdi*F!Qn~o3hBqDgYJR zSh@2^buxm|Mb9VMtV#bObPG!6>X-i-MhLHwbMWZ9+REu{aqYl?Uwxy0HtACRs{gi3 zt8DUJdR64ja-zK75&Scn!00_=&j!|f3TK#v=J=HdJ1~2S<3$e2#prjV*)jV*=c9X< zv0@j8>U(FOz%T9Vr{Y&0yxUv83lYG^casC5d7Oln>@+{a2-1B0Yj%777h=NTUqI#z zM}1#Ev~=9;%j=)h;}_$3 z4DvYMVf?80B+WKCo=IOzn~pA>BOFR_0KY-s|LFPqm5=DXhct3P2|F1OV{-V9Kfzn< zLspBwg(%Vif~R(U&OD|3$7p4{%34mMM(=wwG$}I81ZhXllIj(Lko?XP1FyG>@nZj< zKiR5x7qI0mIP73kLyIgm{OC0_59q+Pqt!%-p&gC;s>Wb;7_H5NIp`Y9!+QpE&^4Hc z-Gd2Z-uTS%IGv4`GmOFT&HwlRLf$^yJXLAAw!8qlGYM##u0cInm|OL3xuuwtmrLZG z>#X{i)s7R$o3&&avyNu)Mn{buu?-N6%FN1fIs=!kDw{9o#4VOKk1KS1AxtOBOyZBB@^Dd7T0HW=gKT0W8xB1yhBx_#e34CZii8focE4l7cs^cU z=Hqh@N{6Yqng?m!`9%G{PeGaa4|pkXrX%}CY22rb!h0I>d~*xOWa=3z37He< z;}UZU0f={K8OCJ(m%bGq{nruo|M>*HlTNW171rZ9ldLX^)qM*n)%>f1^L^DQmThiI zIdy2QkS-QkiZTFs;F%RAD;Ovw{tB9&J&%+!ucHwCiepD<3hS<$5MTENNUj1ivYh3e z&sKe<*Ywz7;X;oqHds{vcKl3hHWCbRwIxgxwcg3b=S*7&!q8TLO&)qsS7+uMw79XN8)iZgrPrY}PVP7kp2K zpuM}v#$Q*sssn|EID2LvmDBdZsvgwu`qbVKNX7<2 z?-Cv=$Z_}kee+xVaHiVJDl`m9LD|#9OKb-xA@%_OVoLJm6VYb*do;M3i29 z%-Wj8K;il7`87WXYtQ!@nc*?a6nqDW&C$SqA;|BV~?GTXQf5!1kH&r?nB` zI-uUfzijxpgxo@Vr)-S%{yLqMHxOp+tQXjeq1=Q1N^4cIKfEsMCZ-qXsx92Zc^Xrm z4d5DgC}jrx#kmzYs19BV^K^}Q46+JxSEpB5EvYy}!5K?DU?&_^_1~o{OeIV4@!2cQ zW*wG0uCOb?IE%HrIH(4psI0x$s{&;*wT0)P_6tC&?E@c~@Q7 zfg3_3+nHCn~y2beQ=iGy5Uv|H<8_enjA&??6Ye(wkBslfz|itWl`3-WX8Z`IFRn9 z^0VN;U%&y zFoMNdUlQqAx(A?a-WdMLsblz;%O1l8Hh~QPrW`W-!={l@S;^poztYP(do!KZxN5Nb zmC4mw>p026Q0+r=Yw#*QVLM(r3&{%8nBU%-HT;3*y~$V3#P%z;85GJc=WAHI8zGim z&|@wNQ;u3Xj`{vdlfY#F&mwMop% zquDCWyl5KBmE{`_l}!xWOhfmSz%qlmap?4i{7pMYl*?+2#7f!$dqIB+n|~|?r+dKe zQ>r32Fm2dZ;s*HZz|bH63HE*5MY|0gn9FkI1<;2w$QEs{E4{0d5d6SoLkYHNXAe^F zP(7JHTk@Zgw~mm3af6R+v|qc*8p#FzY?fz51NpiW;qzB^P{T2P{VOCn2K!GqWU5oI z(tk>&rd+s%)M+I&*TOl!FUwWS?%~gnMJp{#1{2wca=S`SbmWzR zBlix%NAfvzhXJbjXJLiHa}T_zQEcdPYcLFvWUY4u(`QI`94lrh%wC}Q9^*rNP%sN(!JU?bUaUKVzJ=7H)WW3)9d%2YoI0;{WEx2K^Zn_Z}$S-nmei^DtTzTz~6j;`PS6cxyaS0g7yKov>wF~6_A@G0fQ-? zCXm5X-w%W=(a+tkohbHIYab?<16nPq||I#^&UbEbzW_pTFMTlMeE6M&CIXeyEN%(bCwzKc@CxQr-h$r#K!foPy;?v7 zCPbhOt^I|;UF)?rcApF9Z$$(CxQ0@1-~bLxPi-+ZUVBou04jOt+ED3BuhT6>Q_X>< zi7r_VpI|%2+gl?-HCIUvwZmFfi$zF-UBAz1#Z?|4MfW~Jg7v*ViU{Z(up8uc*#T+j z4(7Ip#HO=sl{f1sEAw5t%IC{D(z%UnJdWt{5=VOMdCFW~(!l)E6ivaA&K~>L@jlT! z42Y)B@_z=qF;6S-Sl@j6Q>C8Yu49YV;m%}k$={ZGIen-do3w82O&_jo%nra~eKpC< zv~R0{tkuA-kFzU}Fb^7px_P2}8wOn|8f4sp`{oz0V84X_`@g~62${9&_`QMjDtnLm zAe1a6)%De(Fvmui9$h-JxLKgrYV|CwM=Ieg0(e0qWE2+EZsLA`TL^|JoQY9R0mPfh zc|j9S;OfJeD%WH&2fNCf>*XannjoM0bG?f%oZ-*)ZeG{Rtls_oA0GXSZTE`ra$;Go z(^`@kgArU&3MrO|o0!U3&0;w<2Zm3A)aiRmZ^tf+aL{i*kmhNQgSRJ{&s31%@AlT7 zG5?D?NCBv?zxMF``s-kxuWdE{>q)eNoodH;MQV9R#9#F3tSqaPQ^6r%&XbtMe5u| zH@vzBEcaxTy<5%Ud^}RY$(*w5)_g4UiRV3G-y0wfvS86|&$A(f$H}+B?nE?)c6}VI zeyiz^{_;{wd1m{#jfG!-RZ{IIZ> zV3rC`@-6!7rx?Rw#(VNH=+>`!6bZ*PN_ zIaJg8zFqOgl3TUO?O3~ZVi#H(DS!BOqBJ^w6`31_h*Y4tXja2IYfgkTC9W^@*V!AG zu%v(J2i1*R`y}RvP0*ZUxEPc-zRv3=DfdLKI za9;jBpUuc#J1cg6c)vR-$Mx=y+2!ujx36}UDq}YU`A_fDX*OG*Q<%=YxH>0%&KboG z+Ir^nsb1|tePdJ4Cql`SzShgvb^bB4RtKKEy{XndZ|d^cTj9f%0|Ic{zOCXqDcP{E z*+l-bDsO6Z%5Adwf?V{{@i?nVD#0+V7E;9+i{Pw+tarpAQX$CF+Qg>FQ&zW(F+3>_ zm|hIS^-Fq9R)gY_vZeA|X(0nPqj>S3(USGjyKgde?u(V12}HgK<8ryn!+ zj{s-ttb&uBO@_2h=2>%HPT<<9S@c9tRKC5+skvY!_60Jo!r|!L5DzS?<2U9E;@JvZ zK5F#(Ci+oB=P6#J<{Iq6(SEOnBM16Fb8{HQ)>CL zuo$e#69g{QY(kzWQx!+TF^KATi4Z8$pUJ3i#Oy2AyVC;928$-{o~(@#VE<9M<9=iR>6V+(|1 z^N{~MMUzJTIEfgqv9amr1*q888f!uJ)~|E0*4!T%aXvY)e`@3Sa*`c0Q4XYADA?*q zU0lFU+4-1KNZgi6VzG~&+`vpHivx1w-gge%Ypk(WHP%#P9nXP%--zobgE$DDT`Soc z+u`G{1N|$Qgpuh{FM%F)}a*&UeE# zVMM6Ke!MN~u! ziN(uS&C?lp1Euiak?Dcm9UTucyMjN+B&)yiD}r0Soh@r^+{5AJVu(Temu2<3sgfW7 zlc(3yjeL{3chK)i`8u06G8IR5w-6g4i-SQpx_1hRly=-nt3nsuf#HkS|Ok7e5O_O zsTNPNRr5RtV6ba2!3SyQ-k}5xwB#frJ$MeG(758r^kxmwyQ-P>)XSMIN~6}MWtCsS zi)my|t;H$+>*ABz9_VCJC$}ajR(%?)$pbNomO1fCNvB{-YoiCEOsZv$+q2#DT-=>j z-M3XF()U0;Rbage81JffmIW3&d7}f#a;e%3Y+z!6+jmMA;%Uq#JGIC0#sFjNti1?%5E`GOfbklG*nXK~+~Pv;nF ziX(49S~mFkJfBX1#?-F70JQ+(iuA*nY38n-I@2<)m)obI@b~21TPC`aPPLM71Yq%1D39pl+0d0 z9L!>5{5|39Z{{GC80kGC-|X%fg*#=?6`t~wjgrKjy4@z?NA3^VYqaJ_&5pU0m}9QX z6?|L8&C+Z&p239H0Ox){5j|<@dB*Re??PTT{Kx#3o6#p+!>pJD#k88}K?q6;sIbHB zA-ICn#)a7%D6-mVT_*#m>0fqt1(OBP9MyiPRay9fhdSDZ4J^v|6YLlWf;Q>Al!I^Q zkFzqiHk)T;u~gogI^f49QyYjKomD#s!kSv>MS@90yKx%$Vc>7C)WuM<@2#16C}CUe zYK29g8|am7{dk5FJ3-H287sa{Q(8|!&bk~)m9{r@3mpip=v%&R`3qhdhk!AvAL6$-Z!GDcM36>965j#s+SEP?Qz0wSc$gN28XQD^+wQi zvNH@R^9#T--FI-2bnF1oe2ixHI5P?~Cga0(h)&C?w;^PO#k3 zD0BCDZQ3pUwz$w(T|lNAaJ|1|^VXrcSX~Uv z#hMbY;FWYSjII=S=I;Tk*U%krYVOu~Q&T65i%a7G)^>!Ph>R|=2T_(bl0)>D68>%y zF3t~hD-X;U-4IqCim`Du zTDWLuluACgKGNx^lku4fPSN9zc!7VG}FSF-(NL3o2j?|t7<+U`)vh5Yr` zdZ9dJwA#+HH(DLZ?l?9%s1GFgP!OccLi#GwZMpDzW#3OsE!e?Tk1T3TYjQc|%xE)< z?G)s(lj))YaoD0m_mdse{d_Cd>^2;YBAlO#`zFMF>ptK0wS(=UuB@*dvOG4N3~!rG zPDi~?@385we&Gg}D`rjpRd3h}>FVMO?$}o2dsJTPlC2Y%ujm^oygwup2(Q!;&h$`z zZ-}}oRa`WimYX*uNIr^R|20M?#=hFOojRvsYG{8`4~N5gdD-cf;qOt|p)d1d!iz;w zFBK0)Y&B&T%9_w3yZz41!}LrVLvIJDSnMN8V< zr580|3q}@D0ps>xr3=Uz2668ZMUz4iWp0wNFl^3CskW&2G54<$F5ri=@K(XnhYuqm zadvm9L+ZPL(3=#*pD(e5Ok~KQ2C4vFi?Xis%Nc3MyD-{-kVePhkx$_q!vs;%DoeTm zFs4+3(#wp({spavi($z)|;m*^mbVBnFYgGe}%}B2$wVd)Z{0o7-92Mlb)*b*t?OrCP=X8 zMTzGPZ;UCBs*p(F)L8;7B!cIBp00>ac*OX=cSnrbN0TeP+fvEPk zj_m|Y4ABDdGV`yA8aXbCX)SMGAg@AVz$CL;X2UOG3mG6=yq;-8K=X-D>FL?sR;(3U zTL#RP-$Nt`hA>m~OLJS6hEjzvPU04l2`ek1>|dd%BqAf>bN1C&*yTC=jEgAlFxSrK zFg)4^P+t$Qcp+*Kv9S4OjhbYc$n=8I z#-(#SO33Gb!B9qi5h#0Ejq38Dw4{RSrQ$RHlk)wSVAwU|o5{|9gZ22r@p|kC_@>B| zGi^F2hm|Y47M^hIGOaU-kpR}wWUZ`;nkNT6=WGG5C>5dpWt{;==93VSyF13>@RzYn zaH|TI7URS4k!D|}duKzRyUG>6g=~~gtxTTAXvGNe)ti8Mn&cJ6X=So_Yqi|X2>3qqI zWl_2$&B{c|JJg-TIq@uB5=}$~n)?NNkdf&zoSqIyyfnxP}R@q{fj(s!Z57|02)1{;aZ5y>PzkGMzZF#K#62rV0&z6&{ zZa1gzNaB?O&%$8n0);~Bs)~1-FaNjqZ@wRrCLo`#WhQ0Bq=XFW*cnyz4!h%a4^&it zmra@@c@NCVyKi1^jOQI#I^}=QUX~Rmn82*7BLOs)UUV7(GtINvWCTf(%V{e!hj7Q3 zRM`eEpJ8fKEIh^L;N)eYb5YC+>p4+P#4Sjk9Y?P}!r^u3|-k>Zx@hXKdL6mB56xvc)PCp`;bAW=8PJ?1`SFOU1IAMyq zmXyhKmHlm*)y>l)pTDfqxz1F;2Flh@8S=*2^yix`l_^<4TI3X+CA2DjDj)6v;AcC~ z5S~eVnO%*_+gS!VOqQI-WL{2|v#e*s{}?`AH`n?2S~BI4Q#9y<8%T9hQ1)g7_kG!9 zFo$W4LQ6TE5PSwOF2_L-1FT46D=T&OswJdDPVCVFUBvL5XWlm!pij8oAV(~+8}nVd zu)%q`<&qSIzIdI!fk^l{yvi$3$FU{U8rk+JG4^H)4qV(^+zJm(J{)qJlsnhY^L4S1>@c!!Ve|mZn0xeQSx$vsh)* zDyy#(kJ0iL{T``6xXc_KBEEaV6Fh`zOek2xfK8ihZ`7FbA0_VD(y=4;*P&x?NaCbHTbZ*|fLu&1tr@m#vbkCi6cB(+;0YRT z?Cj(omQY)|qA2|88|3wBvia~l9YYKVuc7|jlubG_PlCf5R2N-6kXuXcUCbt0&j}@| z#Pp$@5n@r5vl5;{gBCPugJG8t1KXyY%K3F&)uvh&7&Zw&UO}7;j(_dL^#{Ro!(%+u zRqwpXfJ#k1{(w8O?^Wcb3Iex;ibNjMJB*n^X;WcsF4z1Lfo+#Js4ydK9)5=D!Z0gh zX$_wOkWbC51mp6WEHY9O-H)?jIDndRGV-6n?mIhdRUa1l+|Yo4 zXE~`z8z`yzA>ob>^KNVUdX?clQ723g{p(z~4oymxgc7GjVzyx#0S2R^Mq?!{y5dHf zhSDHLGzLWg>}?K*YT%QzdSp&@wld3UjQqnUiy2fmmOQ|R*xo+$I1H48dfO!~v%pVX z_Zw+|kX5~th=|@NF=#}J1;&E-Z;{TkpyEq@5Z;;bB}80iMoBF#&4*wtQR*)Po-!nF>eF zq>jxEsjv8;pMj{kme4+6O^ElVzJu^dAW;SHofaJEbs8Q*i2%0&U8dVlTtXZl)%R@v zh=>(e5Po6C`?G3kI&kU2EJ?Ush(_-!IWyej1XuNTJV+ue(i!g?5Uqni}#-mSXEY*7h*%z1bQ2orW}}Q3Sy$R02WGt=3_*z2I7N58(N5g-4n({ z7z=AE-u~2-!3VL$r4H%iF3GTFWz~%*Gmm@b$eTxO0H;<>i67;C3<0#pd&7?@7$;+# zYt_6dI~t4Z95Z;2_o=xY$zv#)=c{DAXAvD7tl5rJ6w+`~7QCk;Jtr%?|#6 z0SCTxAf&l^+ZF^mq25}mq+UWA-9{5d3N$%h{B&Xx) z)er^)|I@7p2EG9PXa0)d_yPblCw}v$JPThn%oKSSIenR;6FNXDU`4&dKq!Lh4c3}+ zcOqUM1UmF!z(M2zTT$T|dh1a!2E#}zuc>emD$=XF>9uY?dx+44%vKTeaec zVQL|GR$I_^S$70TAPALR!|!wbNo@(W2`q<6J<$QPyCRgc(k^;<)X{s_zVTN3OAdLk zjkZ1Jp@>1aoh?@1iStBqmw{d%WrFPG2^>~EFU#f{g72y~p~4tNa7r2+jK|U*Uq}<* zdf{lCc+V%dTWl{j1q_LV(rYNgEIQI|JI4sGTORK#ZwR+Lysvcld1olT*4|4|GL1cg ztwe*VC&*6?Le9&$9~*D~wq86PCtY7lnkWU!fi~oaU97w7%we;4Usr0{x*#$yb>!gg zx>1_nnuEijo_OzBCJcg{9>C>K1tWd?t9JU{a;a7J2VN!^<}v!=RT@qq-=b~q#Pdo^ z^Ck)N@wzJ@xD#NZTi3+tS-@feqyCn@CrL%QH-GlEDAJtmH>Hxb$@G;!vieMULXRYl zrEMwG1Oh!)Sxs>sv!8p1TaV7Zwqic67U`Ies~gj4es)SIoh2dV@RaDOsC*@~m(qUQ z2Lso2OkkuktIAz%W*}?7vXr)>jXi}(ECZ9*Z`kU5!&9cp>`P`dw^~QoReH6K%VL^e z1tLazkLp~MnybmGCeJ!G+XQe~VH!689e9QK9|JQs8nb-dAQ%Y65I9PgW`N)fKV<7V zu`_M!`3y4^XA_8C=WRqDs6E*X^eSuK+!PY)?)!9})q=3qS$@dY-VtLSX?jJeeWv-< z>4$86cIc}|?C_^o{m;-?+LHz;!Vf+5qRyCrV$Wczf?f#DDb+tCmS29w^d<>!S7e~w zj8U8suL#dG4B5>Q#$)j*k&6+Bx)Yd15gFMP8iLdnn+9r3zZQu8=@DiLRa6}oCvr|g z^Fx!*@@5TJ>~&g9W?DrGvGQ3e0dWXAH8zYH&v_zmM9M%D(9a^faod=4)RZ-Ex+%c)_um5ybo>59f=XUF}TH>$Fl=2Qry|E>Tlj8v1CR zPE?hrHoJqu2fThKC3w_8a)~Pn(&fXDWGb8nD6_E;1@QY4!Wtq$BVMSJc*6)D`?PiHfpbStR(XNROWC&T7CE0QGK`hII7uW!7S2T6x%wcFi=+d3OJ*#!K} zG5S`pw`DDr!Yg%vx6(ScR(s`sfD1LlP7^;>=4 zx5j6C&EkoD8`BEVIjQ;i3G?$o;L_v|_3#)0Dv+PgNo7`BGHAJWP#knlN$Zz+jfS_- zM3`_|G3(oMnl|m@2ilQp7QP_2T~Atr8TUK!R0I1&=+q(P2>5U~HkJM&;2035W(PRI zv}^>~JHwL>_@GVFqPUa0(8wr)O{-H)wVPO42HuWceRnz1?M}> z=6h=Oy%8dd9EdtG3shh_33iPY-NuWudT=O?A6gq7<*6kz#Adm&?~koyQ|4IMjE_z= zcx8s>J>1IQ!$J@o@dB1NYCYi80y4zad8Kx+a<3Eeofu*6q0q5qX9xUjPtg&o7V8QF z9n<+7R@G@HM$X|SZkAygu87g^@^aZ)>E~xu53uL7r?Yc=3*^c((`7? zEo=u7+dG6|Cko@mKafA05|Vf|c`?D{USn6~F|K*sVu8@hsbsAiVmX^yqRekn2fBs) zz{2f}IzFxpZ`r(gFRxsncw#R3tE_{V5dzxSTweL>mYa4z%t|pMbQp1MOMN@)mT$mw zE%S;O<`yrjCsfs4B-EDL=3>*0D6_KeW=*WueI24*Ef zMu)j=jsV#rfMZQ<3Udo8VwhDMIv&eHkQ4>kC2-R#FS6;&^Q=0al^2RLmUHxTtZihP zil+nl=kiKLQ=Vs4oze0I7bE;BGqs^@318x$Dl_zhuqS4$KvD_jget?ITUL%jy4#*U zK&oTtm;`nguk!+4ryV%+JlZ&%I=ruITq)O&?y8Gm+A5}OX(vRr8nz||Zlx-$x+}DY z3nREz5Jj&8$Cl!ejmcVZM2HMrThg=m;58+7NQTqE;zYEDj&}7}$ zR68*FBhdPmzL$%lAp0mfp-f{dfYTWA()LjXgq4U;r%;)DK*?oFHdff}hBMA{+z;r9IrZwhpfNUm(8A}*}_murMGT2%G zjSjTzmpL%^SOgUks4f9HrD*_#5NbQ4B0Hqem5T3KuiKCb5cr`VEH^2v^N?MWUAE#y z-&aK?d0)&PXtVr?BaAl6RRUWZe+v==DR@)edk1-?%^`8{{lu7LuE(lGAA^i-V$@i zEzzL3>WNC{zS8;Dl_EDO=(RkgQg~o>75H6Z84ub!>qEBsg!PZ6BcoS6_JBfw+;qRS zV|0i>11?VD?YV!B)xhe~6}*mwTl1OM$ff|}g663;gEhVHl)pw?K!LGw9a!hCzLJ#g z-lfoXd>bUPiXJjh?l0M@k8IekDOjSfTm9xvy#MW`FFeYpSEJuv`WpN|bmHSj>JrGe zSMOt;_@T}!1URp0wDd{`>5Wk3&hp|3eG5K#Vy_N7gd-H_!h1^xd-;-#mNq?9ETSB+k<1ShVN_ORo0n=9H#Krx4>0nFKqQz|G!IX;>^zqeGKzznU{4A z>I@YpEzGE}5Wwcg%;h9&o zK77K1MxQeJM6vn7Eqe<3fNV*&Mu!89uZ%oo47|yQHDK@U6T}BhIHLY2;bEcE<8Vyl zk?^T;Xh)F4DfUBxukGAW=&hJM^*~zSYTo<4I=4lG6lW?Q96wQHw0tFQJfaME(9MbV zrVWoFik`o#rbh298pk%2SjnYGsa>Dfi*)u^(zjWe@tu0=SYhy7j-`CjITjI(^GVix z16c3a+h;C14;HRw)$rbLPWmZ1u@sZ&?O;R~FYEF`Pf_Ub;ukhFs!#Ldrr&1Gq_(mc zIgC|D@d9=cs54xH+HpY|Ag{Sc#dH{+%0o8xaz*&c!qefd@CX(17w2+k{fY<6V-P(i z)Duj1-6u!CH?b}XTYR|v=GYfc1>m0e2I2|rQK-_3_CxMTViU@EGVy^B!+>KDIg2N= zEUox}A;2LSCrZX7Hn;gx%z%v+vOG;vz=p{|Wd~3?fCN7S@Vk{mDqt)Fo(WjYfKp&) z<-`KkczeIRYhq(U-RVzHz6cQ8$71IW5=;E_M*#)B`TZ5UHQT5%7ZFRiPBc6Ff$%|3 zLHy7$wZW;%X9zQ5>GI=wH49uRF<~Wv2X8|j6HP4}kJ{sev)$D86=b3-6mY*g;RT_) zY|z;|9i5GIY#p7LC6CX;nsVZj1(_8veb^M}q2pCBRR;V3C)hnJ$|Cc@Ws_N1WY3OY zl+A0h%p5@W1dyl_W35BLTj}KkLfHcx{I&&#UJX2Hf4UM?I>6|xlAtQ~4XOojC7$Nf zX;!!;{*EtgFcNp~noBqY#+!6~=p$|ouY}vbCb~+T0kj2S+Jfjf0{Md^v?9E%Zqg>7 zc-s$qLh7mv@=P#+ka8TXX(tdm507*b&8{nerU#=)>r|CXyn$8} z3eOFC677aWtnTW^`c7;c^KZimH8QJn3X8ZC%aYouxZ9@~a#CB7W6~_;yPP?*B&+M< za))*Ea_;9nd=K{$>m6`H3gZBdtD%7kE1@ta3wjl;4#>iRwTsi{FZpP!X9ta!bD~bG zx(oY@bxk34dRaORTW1mC5idKt$*olBg-vtTUE(nVdPhrS1(*b=A>djaA5<^qu+i%$ z*~EMOv`YPU;-JktK5JD>zRT;T6@(q%blJs-?bhx0VePe5bv?B*5$6Q*_9@R{`Mebw zkw%tS+;?8B&RJf3K>4C}&lN`o8N#XTgg7E^noKI4PWhASzV?HW%Nt~R%)EEUZ{1N| zznU#h^5Q8@{IuVLLRr-t1fGuNEE`>f3V&4j-#JomlH*3POS$z3R|Nfg;JQ)d+ z$Zh&jj^+l87!=4F(Q-z~y5ZChA|NN79M76s#9D|z|JVg4x$HK}PsziARq~144==Qn z)3U6yXDF$F43(H=VpfSEu#Q0Q4%$ZlsDeijcC`vAKqXmc4=Y?Ol25t4-8bo2ais>XoNnZK7UnqF#m6aZx-Jw-5I~7xSIST_@~J^1vPi~1=)HTDWrA=y2p8Bod*M|Wq5=6S`_|~wbCp1_OS7q@bP#N>=iS`^d zmt=Jlf}H+luC=CLtmNT>hx^yTE_(^qNo-BoOSWTE5<45YiI{8;A0cMdV?~IP+OVnS zQekWI&Fvc4m(#3ns&aL`qu=}4qUF(_9TB%MQ7}PzgEo}Ak_|eJqOi7TP0v$Dt=LQ|@_owIV9 zALkPrm;`>6t739ml?7*jM6!q=2?!cRI>V(wee`)?Mp7x#1^yJxQx6I=QmOjL4IV>*PbNTt2oKzwT}0#c*y(Tup+I4D7?*yH;J3*H4#C zR-nzWHLVr~P=0Xid#?hxi^v5jn0?+i;g(ldf^GR$cx7d-(7sW$?_c6uariv%z_5pS zrGAWA9WC`w!h`7{l8XB}{+6xM6^4v`hR5%Mn zDrc|_74wO?*ZIb$xctp-g|0u-tU*t4{1&(&k+5Zu26uXOD-Q1j3wo5(gOqBs5?l^s{>j%gLfF$CD4%u94V?GF-Je+>qgX>dDd*W=$Z3pTTW2}y|L)^WvOq8%Qr4~AWn%IRah+lS!zXz6e{-CPn<&V0x` z(MAM6pe!C^yBV-@JE@#YS?(<@?6hGsZ|}(*b2%bBS#O;7f$Qh9<+|UJSA;}hR4+re z9jg(BtCFzlXh^um-Ftwgr>0qvqcWJzgqRa`CopdC7PC#@17ORpn>s zkF_n)5I8NbUzE+W;w7aXI|Hl!^iBDS)&>RpPZkyX>o{j@yfxthg5~Gme}$`xe+@Jk zh;SOB42sHYC|n+Ib90Zr;gHf^N1Tb=X@ZL;mW816<62?Z#_z5W{yjkS4>ECg#X<+` zS#3XsPqp1Sr%$-}Vf6~iSOMbL%9s4yy{x|n#yf`z42xKR^kat2;(g3uAknKnC)}e%>zqV<6Kz&EY|Fzhv31AhvKpH`fTJwSvFRP9Rqtx^Cfi0BzWy$|T>3Dq-m;gNmH55t zU3oMpb;10P+@c|30Pe)Z*by3Rv3EO2tU?ku-_+3sa*{Q;+1cdVkz2s~Nx4fy%gnjC zp(ozYX3N&XDcP-cDhS_530s*s`8ANRRzBj6HJ6wB}<<0*G+>7 ztU-_XUsd?Bd0<|oFU(lJY)_Yq&VYM$_h^RB%PttJ4)x$8N0$EB*WtPckx>^NOxkN- zMa9@%4ueU!6+R=Tdl-Od@pFW%@R;ZJp(?!f7Ji-=&(o#dR@RmH29_7En`$}3yZvHs z^y-3dBTz%H0DWhp6X9Ju(#n}woOgojY0PIKx`BnOb<5A%vys4W2rVuL7%18ul9^Bt zXIG%-l|F!x6n@Bajy|vJ&LJ0246N)l*JInY;HwgHt}J9V!d!PfxB}JjAr+Q#NiZ!{E?q9E$au07c5c= z9K0URX0JRqucIDMTB#fns^X{A+ryYltOFt=(y(TIol8HEUGl@o=@&p-1n@UrEFsvG z0LU>qgyM*7A3fH4jc#lo*~$KD)5(-BEsjusEr!u{2OX;D9u_p8fwa2)Dd)TsyAG;z zRbZW_&l>lXw65hkHzBB78{5_&m|oA^3)PR`l*BJB*A?o`!vUaY^t8}v6>*l_`Fe8a zEph=g#n$R#92G8jQTx?TW;rJ75GYXIjaOMop=6@4wuB38B7I!F9ab&L z!C*^YPUvz=sK+0%UpnUqXX4i^PP7!A+Us-`w5xo>dY!5ADDkF$Tv zS0N5va{kNK@h?DoPOB{Sp+NB8hgGI2x#TBrTem3RNfF-y8KLyoa8OGa=0bT>sGA7s z8l`)2`=6RB$kfIC4#BEz92&(3ZYdebiadvR?{O->OG5eQ-Rtp5hc{a(9b9;`p^q^F5XuYG_3R8Q|nz!`vhmb}I{2KCO zb6TEfRd_yIMJat5{R(`|;Z2_v3PBDc<|!0S%M0a!>Cs;Z-(*>~KIC$T2ByM=qpBn4 z2?fsLSc0`|Pn6%GMU_P!E0PWd6@t>#5nwy4SGt~nVV!i;=tMPC+c_z6V4cJw!w!DU zt}FEGtN1{*5s^b4u~9W=xdH|E+0E(V{XTy5JGb9@dk_IiXn8ZWFcSu0!=tUFC11Qs zF9Ij^jxTc2TK2aCT!8D0#NG+ml>a~-{-}l{jEs!pWawxSF(@Kfr2U0{?eJe)eVKqt z@YExy+*rXK)OYTPOoaYDZ*ll1ND3-e>_(~RE!00;x2HC5?Wneys|Dpdypu=ybi-zk zFx}huq8RT9n8kIzD)vbVhi5ARJ>E#>X(yJyd+ZPsyGpqw16{ckTtg{yBtRCu459?A?oMJ+MC-k}+r zx8bu}^PbiHEg)xCSC%j*^@`3oPr98Q$GYX3jW9-+gSx^g63ZgfSEzSaaqh( zFx8-;bErCyb-VQ1J7Vo7b<~}q*dDb&plq1PD429UAjn%VJRoC|L|moB1IzmtGMiZ- z0q0AMLzmb#6F2ob@`Lq0(KJu*`RRMu@(?S9GA~G~BpX|==1E$B{L7dpM_F@`WraCg z%$giL1Kd?jW^v;Eme)dTo-QWR6JO`|;E0Fm0_*u?E84DRKLqYl)PzVvv$JD<dH73D)zQML_`t~UdNbC zJm-xTyE|-9SKQ>Zc<)xm@VA$~0|*GZ^>MM5+v9W1(nT%`NdcL5CJ-K_=w5C8MyNeX0wU!>u z)D&&lac$~X*GlDP(-#86Imw#FWdYGSLIN&pnd^qT>T8KL(+{(v$W$qjqaX$vresx( zWaG2lh6p#ESx5$h&0_+QZ`B$5Zi#e`LIaZ*li6bGkwYxXTst#UY?!#Vyl_}duXr*V zbEoy;ZKN^2xP1I5H}yNe7@jcNNoxQYL#v#Y=KOb%(gY54LZ8yp$w(_0s+TP%SzS8; zrxuV??^?@%b&?T<1=QUfM@vp`m2dUl^)UqCkhAFT zznkY4VLesTz^OYvW6(BL1cNJo+51_m&sGx`l-Aw7+PpbjI-u0C1jOt?=IEEdO^qfK zj)8=c&Y?_|LpH_D4no!g%;HU2t&VI*Eh;iT#&?F`Gnzd(>S4O9wvI;KnA>s)wqxx{ z>&R|OE6eH9BH2b0QU*iL(RtZq1prIURwg|@&QNZPO2eDRd5Z-VNtA`o0BRWnI@A`! z-!+OJW>k-4(4lrJ+3nFPYO84umlSi;8NK9l(GD^^0tK6j*FC1^OeOUBXxc@6?=U)Lzj)koc28u zgaf0j@{=6kD}wZ77Qi7fDW&Rd-KcCn6_00Xz6C`VlR}>s|M?=`E0HEDBmr0ZSd_ZK8sETNACuOJt=_wPS@ze>-sOYadgD4 zxnKXyK17CGUtLH4xi*-;ZN>?qZK8(r=m$$+fQOi9lT;ctV>%$PK~*kJPC0CYz(umE z7S>N{3X&0=mQyfjp6ua&?;nE3MB|GDL&=p6`@T{P)vg6kqSSGVGY04k?C<+QsV5%C zBv!&&_MHbTS4nIOT1lk?9Ec^peDZQ^o;lD!U^-{%3{UCVMY^iV@5bd(gr0;PHLo!n zxdW=c$nXG13__d|;Nz5RmlKxbC(AVFF%YrcLo!7D9`1;HyZc)gAFXr+AG+M%?Q$K! zbnQIeU%Sx@H&I^HS=G38&czZpQ$yn(#Q-gWcy3$ktIqa_*U9$O>{5GA(whKV1)n1Q zD%zdr;P@Nj%19R&z10hkEMPq}V$LGgLXJX8KdmaA5I(Ic>%MaDK#>u?4x*5ExXg;_ zzR8C}?R`;I6y}0|m?2SY;T%~PWaySlpw#V$f=y}H3ZLRg!2oq&0Cj*KNXHrINerAs z@}&sYgyIpMyj$JT+`4H8P$foz$i-krU2S(3X#zKK@!Cdch_3b<0@t;N-=^J!mO^*_ zQ9YmKllHiKPoXaS857AJz-@H7mb%T>-Rc?^;T0Wlg25>l&5zyse0}P1GGwUS?GVs) z1jE)lsrPSi>atphK&VhEppFPc%EXLDBcOk%hT>gW03&?`rCT^TbjqgH$s%%C`w#EG z?FD?bm$Y3~q@Ri9E<8E$E|v2Tt(c^!FEM-3HeOSrk}X@=?IaUfZ*uK~ z0?3ATB%Q;k0=vi@WOq0_W@zqo?!$LupWb7#l!#@=HKNgts*=2!#v6#(XRzJXH04=qfb3lUx=Q2V6 zeRINPnUv?@Y=*wUGCDwIAEV42=rT>~c=X$&v)?&F%Gvz`D zWIK@n0+~}#8EKZZO=}Q{mMk%tbbcRa=YrQob5P2l#(^{V)K&9VL6LUnE)MjXo z2JKv}Epj$pjm?Y=xHSv1QfKDxzu`N<-+u#|5YWBV`9D$Ha+c;825yehsy5j_7O1R) zw^OhJqnBp}c#d!ZfD7&{osTGcwm)v*un~DRvE}D^@fw?Y4XE<%T#OyD1c7nCbGZfi zuVCIOl8{Fx$VcWvO#q+}9RSWnb0pF{&x?n}RACrNzPG3<^yc~U{vZD951`y}PloX5 zkNQ&f?4&3GTd!Kc3IfARzRYIzIy(|#ZnDP>ba0?4Vsk^r5kd?vxVK?5Qzt&^U`h<5 z#9!%A-4_Hy^5Lf4dy`K-^z-d{W%Cy1MduDo3-kBiCx{Gx<<}?W(L2SQXwkxU4WLIKc)MHE-|w419Lb;L~K)c{(%wI?JLPaX`v> z-qSU<$GdtCJ{719K*%Zv1PUqS0@~Al6n%o}qqKTsANy2=`9HJ7RG{!x z`O(Fp+IPhKoW5mQN@*cLZxx;V_37If^gJChNa`G#JA~P0(JPPN#-bp5TtEvRR5+Zrw1Y^^t=( zHof2P{-54J0F461<-E$EUq*c&04Pl|@|vPRJ`-lnkOCVi+#jgKv+=#}4_`N1xC>8ah0XNMz}2|6@yYFf;wz+C{FRjUAdju^ghm`F6^3)FAQhXh{rsJ!OMmD~nyC#U@f35FDHD8q8@L3# zrxNc?pAZhfYY$A=1Tla{=>d3SOX#hHDKr+T8&(1^@Vco|Od)z)Ru^eCwK+Lekg_@8 zUhVs&og<6cbr60{BELhQeqxB(;h>m~-C!p!#khwXbZ4J-~#cnRds zv)3&hoEyJsAsvTG=6s6@s>~%n#F@(VOl^a@>A8x9bs>%M=0(?@atB_aCq1v-%A;Kr z`Ms=|+Nv(0dk<;H`pA{U zds)rVk~4oPN8U|`n1VJ7ue0V6PV8&K$>~cUM=i2zKO&g%Y>I$UPHvHe1WT$il?4|S z$xziF0%8&*4Y&+An6gOHYVfMTE*u1A@HGT4n{qzJ(vU6gbe8p8hUwT>QHT!B-1q4;U(^~VA1D%r+vpuEB!~eYAo)B< z3dwWWI5-I52Vp7jvfD^R?DMu+vC8VV$cLX!PqIE0)x5%Po5K+DzuiZjHBHckqFYei zxZ)zxfuIkXd{5c)>u}?9$Lou9E^69S&Ax@sJ}stP;wUj`OyY@`_VgqpfOqY!4!r=u zG%@FUi8;ToPdj)+A_d%h&+nVDcyu2g?eU{FW!tB7IrN%5-FlgwnFq$+A^AD*GxGph z>e!se*wnM)7&4+gJOhzLv8l^kzPe(yA2%;%S{1{azxs_ay^E$~7@!AM^K@{4x`5r$ zmtUH(*`>E*UE6jzno9gpS_v~@2Klz8YZ8oe>TFDYiTJtuH%>fGeQgJckI64G@$c13 zY&CICJ}rI5*zAt}=`aNmVZ9*_0WoCFULT$DTD%NThsX(DFDoJ$ls>sI-1U z$L1}f`u0}vA2`0@U({*AAEy}}|A#SOjH~O7DJavce42?trM#1(%kPjWzKeZ?9YOgS z^(g|N=PW^nAFEL7qOYbn~9+JbFa1A*ISsc}rx1C8r-U7D2o5D|*FdBHOkd4mdN==UT%|+OLf&KuZh#fOMGlQm!V1rQS#i^qX{T+0v7_70 z&_M*wZ$zM-_c3zuFOPoSk2ykK@7iyGPV3s=zWB$l{`p!&@$%^B#Es@aXaG8O0C5uM zf<#n1@X4s;H;0n07xS#TIRvP+hOpMp0z=aS8J+F47aokb<%LGWqFoZ)RvZ&v1bC1$ zSSsk_!FmXY5@i9VEDY6MnfLfn@13l_0R)=WCBj!>GZwV1lP)*-RNp>0=kC7(m~$JZ zwH27uHVa0h#JBZg9;2-HwucrMoD9n^K-}_AVX@pZy~CadD!Vow=YD|N5CVr@8!uEt zg+`D*0Xa5LXW-YQy#-@1I_@edx3r`Xy2!7caFs~3?Uw3OiYjOAPl6qF9@ow%8J!=` z0@u_ClvGe3j_eLMaRn}(5yqE?PadLngPl{tu73{?feEwc5U3i20{#sb8lqF`M`jF=@Ju# z#(iKej}Th>G)t#r9P=v+KKO2u&L)_u{837~4@bXlx1GDT+Z8cR(N<)SffjxT?~lGt zg#h1hc{Na7-VYNS3ZxyCB*m`^c{56DfD&eZ0Q_Df}ejm;hE8V;sooSMy2@Vy6y z)T+7GbJC8HRg`<3-9HrZa4MJ&zBKZoyY<0?bVC3Ig81F}zQS0U>VSVL*1I zD<3~P!Wu`%+(ZK}>vpTfTwQY7Af?!Tcg#?qdzfIxg%IjsD^yu@FQIMed^k`KR69>L z^twjCfl&t{;al(!0e7r79$j{A{;anS>QdI?UByx>jzKGt76Bc;J-otN5RVGwX*)lA zvLGc1aPI2MR zZVfc7l8dAap~TqKur00gxr@Se8}gc6N?᦯r_d_MU>i$Ky_j}uLrQq1}XO2`X@ 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�KC3ET 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
iOF7EIg(}HsDh__tMu_s<$hdcO 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�{#S#lushw@e5*K8wgi=+G z128l`pjHp##3RFm9^DvS%u<5%#YJrm+s?#eAsR|b3X32P&#NKdKwyPgNz$RJd{9m_ zg&n&Y&#BD0j7-w7eOpB!D=b1XEAPd`f59n#hx3=ggfrO9EMllNh5li_4d_qHXhanq zb~T%vSM|B6Gny`O55!0`$_ATsd^lyQMq;a^wAHtJy~AE|zk9H?x7|BtEuI|vc(C1n z_pk>cJGvW(y}tHFYG9opZQ`h|QtKQCc52eGu+j%r9c!EqZIh0>7&fY^vw%nvxY=F! z#Dt}h(Z2(gkmGP@Oz>iea!K*)2IBj&_8rBRvA5(OiYtWq-xMzWbWBtcRx5*j(Ay)I zB1ht}0jomB;f!oWq2!j%9wljKe&`6O&eD{0c5nbZUxY>uhy#?dfc~_?9%mg8q`M(`dmQ9pzg0~Xz##YoV?D&0nxnI&t4Yo=6wXo%F^MSw zos!5ipo&m!O3rLrR3^hD%oFtYLd=WhM&c^FVPZq7-OWTRmRAATGc+M~c&O4xv#Aot!E(|YgkR|+GqSrB z25guYp5LFdW~xPW&*^rT9dPVlfF}i*O|4cwQc*!sf%Eqb`kU1S9SEIAaw8k&c=5=% zMzADp;7soxA9^m(bZX0Nb4f0vk7MrAJ{VLXZO^-d0xzJOrPC>l+Lj z)9QeRs>^nAfvJ=Z$`4Im_yUv)U&GwX?!nE=XCHhy_+CiGx=dJ)!Y-;$>lxsJ^aG@u zWJO!(nrJ#}B6E#C+>~45IyW?#aqMpiUu>Gfg1DY^VQD{B1>0W&bEOQp)S#;D6VQOB z7(jr;kO8L8K@BR#4;g)k02yU1Zg4HTu)3}x#NUiYwFR9IP`ThJ$UuriY8K!?I2mt& z=SJzc0*yYW(68eLflPIPVau!+7^`sxOdACBweFOxD=sYQk|B>FrPjzE)-=AREh1Yy zj}uo93#;Ltf*z3_+j+n0jRwlOSd4Q^*-?aB%<}#@A$7m40M*y!i@QQ7Hyffg)lNRQ zne=MgHR`gB$YH1Suw#PQg>fkM^%Y*DByG*zAv@m5czUS$V{{e0CF)>^0`LS+s1jv(8!jZ$UP10Mp!b=mkc5W`}&>0*?q^d1wGa9%)Z-)IR%xar;SRSbDcZRYO6Fz*4fUIY9{IMs zq+sxwt)iSn!BMhFP-Zt}FJ_0-5W5$wt10{T$%6AkN~kt%RP*Wur6Q<0G5$=eQVbU2 zhR_ewxMCnA@jQ;ATxx?zg=wP;h~_tksshUX5lZo4`vPf-1tUaPy~maVNd|9hku+ws zkmt^GLQ3Oo9{?mSy}V*LRj44d@FwSdwInyu;46!jEo6$hB&_N3mckN#ZB*-?ys(8n z#H;gemTl#xs7Cr8sU7&vTU0@cT@8(m+e37v@c!q5tGI~XLComro}M!uxDWcHY`VaU zZ0Zbi_bHdlhy$rsA<% zznG_stjgR$-k^A)w$qB41Zd2_K76UFk7iZFUiRLB$F|!_%+%{qGPs{`#EE9n6@aYm zEN?V}!f)~tkm(#mhR(!7u$zIm;t87)X)y*^-7NEY;JdG2uingf=v3!x}dfSqzp0jBUh8~fEYHKFOQ6 zHqg!iA}&=0-GsD~U|(0#l0n3{bHb*XsE`=Nz!78;4R~nhffX>SZ&fvO3eH>eF6wDI zSva{|h`_ll4cYC&3)RSr&IwGR0L{2sCG$*HmBoeL#P^jlf*2pPt6>7(;mw7c3=SQ` zdxtN!=c%%K+DbOd+XKY+G(6rh+fgC-#P1PmmOQ%XCTRiN)Nhu?7Isvd zNdN%SVSOt|y4xWk1a7_R5Un52Mx(qO4NV#Xk#jr9%vo4zG|8e+`;kltOKpG)NV*Y$ zGw~pD?2vo_7ZI$?!{fj&Y-0#7Cj!cVu@peTn0xNj7F782L6FqQCUdFjQ>`ndH zoLR!sR<@Olm{u{fCZx@0BrzhdkZ%l^k%snwi%Kp)q#(3gGB)nWLoYNJ zmrn$u@f0n-f&C^~n{Cwez@E2?n~W42@IUH4WIXWT6noK?QsLJN-O^I=s5h6@K*$B> zE$i>H4>nm$;79 z<~rcu2qHoEu%z%(@(`Iw+hF6sRm&nRd1OkUJIx8ulx}$5o#tX%GJR)eNx2{4X?L0{ zBW9Q09Wfst^myVNVX^K&U`2^`!ex5lyLOfBm%i$SH+W|UBjhl2bmKcMA$#n6oHuBi zt_HKXIL9`npnPzom@m3-=3PcNK&PdZnc*%_Iho%c?2Is65NW&wKVI9ol!V*hR|h^< zFE3ngI4P29&1KTL5@*3YpN{?kS-T)yn9KuCH;ggg&y>LvLAN6LKI_J zSD|()YTc~xw>s}_sgXE(c+RF5l6kzlf3&xqfS^3tKlbWC+ridHJ~T0noNXTTH}`=F zKnEsB(L3;@#k_)1JA+OhSIsr%u2P=k2m<`fM8ndvERc>6CI=rxIlp{cvusvWwmH2N z&{uWdf`?U|w;>M3%=Y&&(h-0i6Q8xmS2M_d*fT(w#Zt52I&bgY+<|c*`E*s8IUlfy zD&k|?L}pQVIgy}Dfm@Uy_6`LUezz}vqMPlzvlBbR`{wPQdC&l zZP7jDbtNar)Oi8fF|1XBr}>3i>;O5iOo&IaMx!t;B`sc}tmtl_n;=$y&}Ze0@Me9$ zG7`nQA}m#02E!;AbpfFgQ7laQG9QL@0`0spwKe2FL+xi7ee9NHH7iqO`|q1_7FzBQ zEfJPLRh*R{gs-SI?9GFzclHn#q3?ETnk4mt9uSSW+eVI2e)C=#Ol$C%2(1pE9P2!n z_M8+7t0JQZE&?kO6^myT0W{Uw@U)Te+7X`}6%f5EbL2|~^94iB{A-RqgWNvV{FU)e z;<@{Xj&@;L-HK$bOXkGP^Gax>35({^qMBvH!qirdFpyU}$$N(f+X*^A+T2OD_q)4$ z^w>SxWv|{OFhhS5-J{*$cBW9!$okl*t8>Tn%U1VcAjOj%N`y^ogZc?aqI%B0EtM_4 zZ%V@u&Ys^VcXTcV$uVk7m-bxX*_d8}%Q}Q3eKSDAs|!L7M`3!T*cl}s2ms)>fJTsZ z5M>+@!-W#a?sj_EWf|zM%xnqnYy^!L4=^gn;UQ#E3J$qMeNcBefqwf3>mAa~##wvw aYafW=Xs@c8&YPXi*Z+UO;mjyxkQM-Ep8i?@ literal 0 HcmV?d00001 diff --git a/frontend-dist/js/app.ae8d51dc.js b/frontend-dist/js/app.4cfd3d69.js similarity index 99% rename from frontend-dist/js/app.ae8d51dc.js rename to frontend-dist/js/app.4cfd3d69.js index 1863d280..320df31c 100644 --- a/frontend-dist/js/app.ae8d51dc.js +++ b/frontend-dist/js/app.4cfd3d69.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={457:function(e,a,t){var o=t(94373);const n=o.A.create({baseURL:"/",withCredentials:!0});a.A=n},16915:function(e,a,t){var o=t(48512),n=t(51219),l=t(25507),i=t(457),r=t(46638);const s=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(903),t.e(173),t.e(30),t.e(24)]).then(t.bind(t,62024)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(903),t.e(380),t.e(63)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(30),t.e(549)]).then(t.bind(t,11017)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(997)]).then(t.bind(t,60997)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(183)]).then(t.bind(t,64183)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(903),t.e(380),t.e(803)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>Promise.all([t.e(903),t.e(711)]).then(t.bind(t,5215))},{path:"/whiteliston",name:"whiteliston",component:()=>Promise.all([t.e(903),t.e(773)]).then(t.bind(t,86569))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(743).then(t.bind(t,92743))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Promise.all([t.e(903),t.e(787)]).then(t.bind(t,75875))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照
配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","refreshAnnouncement":"刷新公告已读状态","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","refreshAnnouncement":"Reset announcement read status","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),G=t(10798),_=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),Ge=t(97447),_e=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,G.A,_.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,Ge.Jm,_e.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{22:"b436b08e",24:"e38d6915",63:"503c70e6",183:"37299d64",380:"62235203",549:"ffe205fb",711:"936a7109",743:"f28adaf7",773:"f0780366",787:"d0dbc2dd",803:"4f2ba956",903:"1e4b549d",997:"55a5bae5"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{24:"8f430d51",30:"c12a4e5b",63:"398231b7",173:"f8fd1fa2",183:"49a29035",322:"2b40f004",549:"0f00dee2",711:"e6dbd5da",743:"4cb567b6",773:"b55efe26",787:"f6f7607a",803:"398231b7",997:"c0e2a060"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),c=0;c{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(903),t.e(173),t.e(30),t.e(24)]).then(t.bind(t,62024)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(903),t.e(380),t.e(63)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(30),t.e(549)]).then(t.bind(t,11017)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(997)]).then(t.bind(t,60997)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(903),t.e(173),t.e(22),t.e(322),t.e(719)]).then(t.bind(t,98719)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(903),t.e(380),t.e(803)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>Promise.all([t.e(903),t.e(711)]).then(t.bind(t,5215))},{path:"/whiteliston",name:"whiteliston",component:()=>Promise.all([t.e(903),t.e(773)]).then(t.bind(t,86569))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(743).then(t.bind(t,92743))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Promise.all([t.e(903),t.e(787)]).then(t.bind(t,75875))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectedItems":"项已选","clearSelection":"清除选择","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","fileListMemoryCacheWarning":"文件列表较大,已切换为内存缓存;刷新页面后需要重新加载列表。","indexingWarning":"索引构建中,当前搜索和排序结果可能不准确,请稍后再试。","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","channelNameImmutableTip":"添加后将作为文件关联渠道的唯一标识,不支持修改","channelNameEditDisabledTip":"渠道名称用于关联已上传文件,不支持修改","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"可选,请填写完整 CDN 访问地址前缀,例如:https://cdn.example.com","cdnDomainTip":"可选配置。可用于生成和展示文件访问链接,服务端读取文件内容时也会优先尝试通过 CDN 读取。","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选,请填写完整公开访问地址前缀,例如:https://cdn.example.com/imgbed","webdavPublicUrlTip":"可选配置。服务端读取文件内容时会优先尝试通过该公开地址读取,失败后回退 WebDAV API。","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?删除后,仍关联该渠道的文件可能无法访问。","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","ipQuery":"IP 归属地查询","ipQueryTooltip":"上传时按配置调用自定义 API 查询上传 IP 归属地,参数值支持 {\'{ip}\'} 占位符","enableIpQuery":"开启查询","ipQueryChannel":"查询渠道","ipQueryChannelPlaceholder":"请选择查询渠道","customApi":"自定义 API","queryParams":"查询参数","paramNamePlaceholder":"参数名","paramValuePlaceholder":"参数值,如 {\'{ip}\'}","addQueryParam":"添加参数","responseFields":"响应字段","responseFieldsTip":"最终显示内容会按照字段顺序拼接","responseFieldPathPlaceholder":"JSON 路径,如 country.name","addResponseField":"添加字段","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除认证信息","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为 1-3650 的正整数"},"sysPage":{"settingsSaved":"设置已保存","refreshAnnouncement":"刷新公告已读状态","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectedItems":"selected","clearSelection":"Clear selection","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","fileListMemoryCacheWarning":"The file list is large, so it is being kept in memory. Refreshing the page will require loading it again.","indexingWarning":"The index is still building, so current search and sort results may be inaccurate. Please try again later.","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","channelNameImmutableTip":"After creation, this becomes the unique identifier for files associated with the channel and cannot be changed","channelNameEditDisabledTip":"The channel name links uploaded files to this channel and cannot be changed","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"Optional. Enter the full CDN URL prefix, e.g. https://cdn.example.com","cdnDomainTip":"Optional. Can be used to generate and display file access links. Server-side file reads also try the CDN first.","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional. Enter the full public URL prefix, e.g. https://cdn.example.com/imgbed","webdavPublicUrlTip":"Optional. Server-side file reads try this public URL first and fall back to the WebDAV API on failure.","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel? Files still associated with it may become inaccessible.","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","ipQuery":"IP Geolocation Query","ipQueryTooltip":"Calls a custom API during upload to query the upload IP location. Parameter values support the {\'{ip}\'} placeholder","enableIpQuery":"Enable Query","ipQueryChannel":"Query Channel","ipQueryChannelPlaceholder":"Select query channel","customApi":"Custom API","queryParams":"Query Parameters","paramNamePlaceholder":"Parameter name","paramValuePlaceholder":"Parameter value, e.g. {\'{ip}\'}","addQueryParam":"Add Parameter","responseFields":"Response Fields","responseFieldsTip":"The final display text is joined in field order","responseFieldPathPlaceholder":"JSON path, e.g. country.name","addResponseField":"Add Field","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear authentication info","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be an integer from 1 to 3650"},"sysPage":{"settingsSaved":"Settings saved","refreshAnnouncement":"Reset announcement read status","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},81525:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(30292),s=t(47984),d=t(79262),c=t(70193),u=t(55363),m=t(31050),p=t(22909),h=t(10220),g=t(74036),f=t(90389),y=t(81828),b=t(27483),C=t(66806),k=t(61536),T=t(3263),w=t(57038),v=t(63416),S=t(63027),P=t(19223),F=t(93422),A=t(16249),D=t(34335),L=t(14722),U=t(16829),N=t(53916),M=t(48749),I=t(2511),R=t(12375),x=t(97619),B=t(84310),E=t(14552),O=t(79919),W=t(10767),q=t(20491),V=t(18422),j=t(17214),H=t(44845),z=t(55319),K=t(71669),Q=t(38557),J=t(15925),G=t(10798),_=t(39329),Y=t(59708),X=t(41165),$=t(50230),Z=t(99288),ee=t(67992),ae=t(37538),te=t(13118),oe=t(36050),ne=t(69721),le=t(75192),ie=t(50672),re=t(3149),se=t(11221),de=t(73585),ce=t(63236),ue=t(1860),me=t(13110),pe=t(6246),he=t(42302),ge=t(75504),fe=t(40587),ye=t(5299),be=t(81775),Ce=t(13127),ke=t(18742),Te=t(97579),we=t(56746),ve=t(58422),Se=t(20444),Pe=t(88502),Fe=t(21872),Ae=t(64795),De=t(82262),Le=t(88921),Ue=t(39916),Ne=t(18579),Me=t(80500),Ie=t(58428),Re=t(87849),xe=t(78034),Be=t(59413),Ee=t(58869),Oe=t(79102),We=t(78337),qe=t(38870),Ve=t(70577),je=t(93212),He=t(40275),ze=t(52995),Ke=t(38410),Qe=t(167),Je=t(53223),Ge=t(97447),_e=t(67830),Ye=[u.rC,m.UH,p.B0,h.Ce,g.IN,s.xK,f.Df,y.ck,b.LB,C.e4,k.ok,T.$F,w.gK,v.e6,S.rQ,P.Jt,F.Wz,A.Xk,D.B2,L.a$,U.jB,d.ZD,N.wF,M.rO,I.jT,R.Xb,x.dB,B.Ub,E.q9,O.rM,W.jP,q.he,c._2,V.cb,j.MT,H.vH,z.v,K.bx,Q.tU,J.zp,G.A,_.pS,Y.A4,X.h8,$.o1,Z.UD,ee.mR,ae.ao,te.Uj,oe.gD,ne.Bw,le.CY,ie.In,re.v0,se.lS,de.jb,ce.yv,ue.Up,me.iW,pe.CQ,he.IT,ge.EZ,fe.xb,ye.PJ,be.X,Ce.ji,ke.is,Te.R9,we.QL,ve.wR,Se.oE,Pe.ye,Fe.UB,Ae.hS,De.Mj,Le.D6,Ue.QO,Ne.V2,Me.im,Ie.Gx,Re.H9,xe.Yp,Be.z1,Ee.Nf,Oe.oM,We.VN,qe.Ot,Ve.xi,je._2,He.DX,ze.l9,Ke.GR,Qe.ns,Je.Be,Ge.Jm,_e.Mc],Xe=t(97722),$e=(t(85331),t(10961),t(56768));function Ze(e,a,t,o,n,l){const i=(0,$e.g2)("router-view"),r=Xe.H6;return(0,$e.uX)(),(0,$e.Wv)(r,{locale:l.elementLocale},{default:(0,$e.k6)(()=>[(0,$e.bF)(i)]),_:1},8,["locale"])}var ea=t(60782),aa=t(6166),ta=t(55186),oa=t(54791),na={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,ea.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?ta.A:oa.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(aa.ae.valid(document.body))return void(this.osInstance=(0,aa.ae)(document.body));this.osInstance=(0,aa.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},la=t(71241);const ia=(0,la.A)(na,[["render",Ze]]);var ra=ia,sa=t(16915),da=t(25507),ca=t(46638),ua=t(57477);t(21862),t(50635);i.Yv.add(...Ye);const ma=(0,o.Ef)(ra),pa=(0,n.Zf)();ma.component("font-awesome-icon",r.gc);for(const[ba,Ca]of Object.entries(ua))ma.component(ba,Ca);const ha=()=>{const e=document.documentElement;let a;if(da.A.state.cusDarkMode&&null!==da.A.state.useDarkMode)a=da.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}da.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},ga=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},fa=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},ya=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};da.A.dispatch("fetchUserConfig").then(()=>{ha(),fa(da.A.getters.userConfig),ya(da.A.state.useDarkMode,da.A.getters.userConfig),da.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&da.A.state.cusDarkMode&&(ga(a.useDarkMode),ya(a.useDarkMode,da.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(ha(),ya(da.A.state.useDarkMode,da.A.getters.userConfig))}),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),ma.use(da.A).use(sa.A).use(l.A).use(ca.Ay).use(pa).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{22:"b436b08e",24:"e38d6915",63:"503c70e6",380:"62235203",549:"ffe205fb",711:"936a7109",719:"b7883017",743:"f28adaf7",773:"f0780366",787:"d0dbc2dd",803:"4f2ba956",903:"1e4b549d",997:"55a5bae5"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{24:"8f430d51",30:"c12a4e5b",63:"398231b7",173:"f8fd1fa2",322:"2b40f004",549:"0f00dee2",711:"e6dbd5da",719:"172d8277",743:"4cb567b6",773:"b55efe26",787:"f6f7607a",803:"398231b7",997:"c0e2a060"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/app.ae8d51dc.js.map b/frontend-dist/js/app.4cfd3d69.js.map similarity index 99% rename from frontend-dist/js/app.ae8d51dc.js.map rename to frontend-dist/js/app.4cfd3d69.js.map index 481cd2b6..c66b77f2 100644 --- a/frontend-dist/js/app.ae8d51dc.js.map +++ b/frontend-dist/js/app.4cfd3d69.js.map @@ -1 +1 @@ -{"version":3,"file":"js/app.ae8d51dc.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/utils/fontawesomeIcons.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(...fontAwesomeIcons);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"22\":\"b436b08e\",\"24\":\"e38d6915\",\"63\":\"503c70e6\",\"183\":\"37299d64\",\"380\":\"62235203\",\"549\":\"ffe205fb\",\"711\":\"936a7109\",\"743\":\"f28adaf7\",\"773\":\"f0780366\",\"787\":\"d0dbc2dd\",\"803\":\"4f2ba956\",\"903\":\"1e4b549d\",\"997\":\"55a5bae5\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"24\":\"8f430d51\",\"30\":\"c12a4e5b\",\"63\":\"398231b7\",\"173\":\"f8fd1fa2\",\"183\":\"49a29035\",\"322\":\"2b40f004\",\"549\":\"0f00dee2\",\"711\":\"e6dbd5da\",\"743\":\"4cb567b6\",\"773\":\"b55efe26\",\"787\":\"f6f7607a\",\"803\":\"398231b7\",\"997\":\"c0e2a060\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"24\":1,\"30\":1,\"63\":1,\"173\":1,\"183\":1,\"322\":1,\"549\":1,\"711\":1,\"743\":1,\"773\":1,\"787\":1,\"803\":1,\"997\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(173|30|322)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.4cfd3d69.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/utils/fontawesomeIcons.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { faAws } from '@fortawesome/free-brands-svg-icons/faAws';\r\nimport { faCloudflare } from '@fortawesome/free-brands-svg-icons/faCloudflare';\r\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons/faDiscord';\r\nimport { faAngleDoubleLeft } from '@fortawesome/free-solid-svg-icons/faAngleDoubleLeft';\r\nimport { faAngleDoubleRight } from '@fortawesome/free-solid-svg-icons/faAngleDoubleRight';\r\nimport { faArrowDown } from '@fortawesome/free-solid-svg-icons/faArrowDown';\r\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons/faArrowLeft';\r\nimport { faArrowUp } from '@fortawesome/free-solid-svg-icons/faArrowUp';\r\nimport { faBan } from '@fortawesome/free-solid-svg-icons/faBan';\r\nimport { faBars } from '@fortawesome/free-solid-svg-icons/faBars';\r\nimport { faBook } from '@fortawesome/free-solid-svg-icons/faBook';\r\nimport { faBullhorn } from '@fortawesome/free-solid-svg-icons/faBullhorn';\r\nimport { faCalendar } from '@fortawesome/free-solid-svg-icons/faCalendar';\r\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons/faChartBar';\r\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons/faChartLine';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';\r\nimport { faCheckSquare } from '@fortawesome/free-solid-svg-icons/faCheckSquare';\r\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';\r\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft';\r\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';\r\nimport { faCircleHalfStroke } from '@fortawesome/free-solid-svg-icons/faCircleHalfStroke';\r\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock';\r\nimport { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';\r\nimport { faCloudUpload } from '@fortawesome/free-solid-svg-icons/faCloudUpload';\r\nimport { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons/faCloudUploadAlt';\r\nimport { faCode } from '@fortawesome/free-solid-svg-icons/faCode';\r\nimport { faCodeBranch } from '@fortawesome/free-solid-svg-icons/faCodeBranch';\r\nimport { faCog } from '@fortawesome/free-solid-svg-icons/faCog';\r\nimport { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';\r\nimport { faComments } from '@fortawesome/free-solid-svg-icons/faComments';\r\nimport { faCompressAlt } from '@fortawesome/free-solid-svg-icons/faCompressAlt';\r\nimport { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy';\r\nimport { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';\r\nimport { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';\r\nimport { faEdit } from '@fortawesome/free-solid-svg-icons/faEdit';\r\nimport { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH';\r\nimport { faEllipsisV } from '@fortawesome/free-solid-svg-icons/faEllipsisV';\r\nimport { faExclamation } from '@fortawesome/free-solid-svg-icons/faExclamation';\r\nimport { faExclamationCircle } from '@fortawesome/free-solid-svg-icons/faExclamationCircle';\r\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';\r\nimport { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons/faExternalLinkAlt';\r\nimport { faEye } from '@fortawesome/free-solid-svg-icons/faEye';\r\nimport { faFile } from '@fortawesome/free-solid-svg-icons/faFile';\r\nimport { faFileAlt } from '@fortawesome/free-solid-svg-icons/faFileAlt';\r\nimport { faFileExport } from '@fortawesome/free-solid-svg-icons/faFileExport';\r\nimport { faFileSignature } from '@fortawesome/free-solid-svg-icons/faFileSignature';\r\nimport { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';\r\nimport { faFolder } from '@fortawesome/free-solid-svg-icons/faFolder';\r\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen';\r\nimport { faFolderTree } from '@fortawesome/free-solid-svg-icons/faFolderTree';\r\nimport { faGlobe } from '@fortawesome/free-solid-svg-icons/faGlobe';\r\nimport { faHashtag } from '@fortawesome/free-solid-svg-icons/faHashtag';\r\nimport { faHistory } from '@fortawesome/free-solid-svg-icons/faHistory';\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons/faHome';\r\nimport { faICursor } from '@fortawesome/free-solid-svg-icons/faICursor';\r\nimport { faImage } from '@fortawesome/free-solid-svg-icons/faImage';\r\nimport { faImages } from '@fortawesome/free-solid-svg-icons/faImages';\r\nimport { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';\r\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons/faLink';\r\nimport { faList } from '@fortawesome/free-solid-svg-icons/faList';\r\nimport { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';\r\nimport { faMinusSquare } from '@fortawesome/free-solid-svg-icons/faMinusSquare';\r\nimport { faMoon } from '@fortawesome/free-solid-svg-icons/faMoon';\r\nimport { faMusic } from '@fortawesome/free-solid-svg-icons/faMusic';\r\nimport { faPager } from '@fortawesome/free-solid-svg-icons/faPager';\r\nimport { faPaperPlane } from '@fortawesome/free-solid-svg-icons/faPaperPlane';\r\nimport { faPaste } from '@fortawesome/free-solid-svg-icons/faPaste';\r\nimport { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\nimport { faQuoteRight } from '@fortawesome/free-solid-svg-icons/faQuoteRight';\r\nimport { faRedo } from '@fortawesome/free-solid-svg-icons/faRedo';\r\nimport { faRobot } from '@fortawesome/free-solid-svg-icons/faRobot';\r\nimport { faSave } from '@fortawesome/free-solid-svg-icons/faSave';\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons/faSearch';\r\nimport { faServer } from '@fortawesome/free-solid-svg-icons/faServer';\r\nimport { faShareAlt } from '@fortawesome/free-solid-svg-icons/faShareAlt';\r\nimport { faShield } from '@fortawesome/free-solid-svg-icons/faShield';\r\nimport { faShieldAlt } from '@fortawesome/free-solid-svg-icons/faShieldAlt';\r\nimport { faSignOutAlt } from '@fortawesome/free-solid-svg-icons/faSignOutAlt';\r\nimport { faSortAlphaUp } from '@fortawesome/free-solid-svg-icons/faSortAlphaUp';\r\nimport { faSortAmountDown } from '@fortawesome/free-solid-svg-icons/faSortAmountDown';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons/faSpinner';\r\nimport { faSquare } from '@fortawesome/free-solid-svg-icons/faSquare';\r\nimport { faSun } from '@fortawesome/free-solid-svg-icons/faSun';\r\nimport { faSync } from '@fortawesome/free-solid-svg-icons/faSync';\r\nimport { faSyncAlt } from '@fortawesome/free-solid-svg-icons/faSyncAlt';\r\nimport { faTachometerAlt } from '@fortawesome/free-solid-svg-icons/faTachometerAlt';\r\nimport { faTag } from '@fortawesome/free-solid-svg-icons/faTag';\r\nimport { faTags } from '@fortawesome/free-solid-svg-icons/faTags';\r\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons/faThLarge';\r\nimport { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';\r\nimport { faTools } from '@fortawesome/free-solid-svg-icons/faTools';\r\nimport { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt';\r\nimport { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';\r\nimport { faUserCog } from '@fortawesome/free-solid-svg-icons/faUserCog';\r\n\r\nexport default [\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faArrowDown,\r\n faArrowLeft,\r\n faArrowUp,\r\n faAws,\r\n faBan,\r\n faBars,\r\n faBook,\r\n faBullhorn,\r\n faCalendar,\r\n faChartBar,\r\n faChartLine,\r\n faCheck,\r\n faCheckSquare,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCircleHalfStroke,\r\n faClock,\r\n faCloud,\r\n faCloudflare,\r\n faCloudUpload,\r\n faCloudUploadAlt,\r\n faCode,\r\n faCodeBranch,\r\n faCog,\r\n faCogs,\r\n faComments,\r\n faCompressAlt,\r\n faCopy,\r\n faDatabase,\r\n faDiscord,\r\n faDownload,\r\n faEdit,\r\n faEllipsisH,\r\n faEllipsisV,\r\n faExclamation,\r\n faExclamationCircle,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faEye,\r\n faFile,\r\n faFileAlt,\r\n faFileExport,\r\n faFileSignature,\r\n faFilter,\r\n faFolder,\r\n faFolderOpen,\r\n faFolderTree,\r\n faGlobe,\r\n faHashtag,\r\n faHistory,\r\n faHome,\r\n faICursor,\r\n faImage,\r\n faImages,\r\n faInbox,\r\n faInfoCircle,\r\n faLink,\r\n faList,\r\n faMinus,\r\n faMinusSquare,\r\n faMoon,\r\n faMusic,\r\n faPager,\r\n faPaperPlane,\r\n faPaste,\r\n faPlus,\r\n faQuestionCircle,\r\n faQuoteRight,\r\n faRedo,\r\n faRobot,\r\n faSave,\r\n faSearch,\r\n faServer,\r\n faShareAlt,\r\n faShield,\r\n faShieldAlt,\r\n faSignOutAlt,\r\n faSortAlphaUp,\r\n faSortAmountDown,\r\n faSpinner,\r\n faSquare,\r\n faSun,\r\n faSync,\r\n faSyncAlt,\r\n faTachometerAlt,\r\n faTag,\r\n faTags,\r\n faThLarge,\r\n faTimes,\r\n faTools,\r\n faTrashAlt,\r\n faUpload,\r\n faUserCog\r\n];\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\nimport fontAwesomeIcons from './utils/fontawesomeIcons';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(...fontAwesomeIcons);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"22\":\"b436b08e\",\"24\":\"e38d6915\",\"63\":\"503c70e6\",\"380\":\"62235203\",\"549\":\"ffe205fb\",\"711\":\"936a7109\",\"719\":\"b7883017\",\"743\":\"f28adaf7\",\"773\":\"f0780366\",\"787\":\"d0dbc2dd\",\"803\":\"4f2ba956\",\"903\":\"1e4b549d\",\"997\":\"55a5bae5\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"24\":\"8f430d51\",\"30\":\"c12a4e5b\",\"63\":\"398231b7\",\"173\":\"f8fd1fa2\",\"322\":\"2b40f004\",\"549\":\"0f00dee2\",\"711\":\"e6dbd5da\",\"719\":\"172d8277\",\"743\":\"4cb567b6\",\"773\":\"b55efe26\",\"787\":\"f6f7607a\",\"803\":\"398231b7\",\"997\":\"c0e2a060\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"24\":1,\"30\":1,\"63\":1,\"173\":1,\"322\":1,\"549\":1,\"711\":1,\"719\":1,\"743\":1,\"773\":1,\"787\":1,\"803\":1,\"997\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(173|30|322)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(81525); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","faAngleDoubleLeft","faAngleDoubleRight","faArrowDown","faArrowLeft","faArrowUp","faAws","faBan","faBars","faBook","faBullhorn","faCalendar","faChartBar","faChartLine","faCheck","faCheckSquare","faChevronDown","faChevronLeft","faChevronRight","faCircleHalfStroke","faClock","faCloud","faCloudflare","faCloudUpload","faCloudUploadAlt","faCode","faCodeBranch","faCog","faCogs","faComments","faCompressAlt","faCopy","faDatabase","faDiscord","faDownload","faEdit","faEllipsisH","faEllipsisV","faExclamation","faExclamationCircle","faExclamationTriangle","faExternalLinkAlt","faEye","faFile","faFileAlt","faFileExport","faFileSignature","faFilter","faFolder","faFolderOpen","faFolderTree","faGlobe","faHashtag","faHistory","faHome","faICursor","faImage","faImages","faInbox","faInfoCircle","faLink","faList","faMinus","faMinusSquare","faMoon","faMusic","faPager","faPaperPlane","faPaste","faPlus","faQuestionCircle","faQuoteRight","faRedo","faRobot","faSave","faSearch","faServer","faShareAlt","faShield","faShieldAlt","faSignOutAlt","faSortAlphaUp","faSortAmountDown","faSpinner","faSquare","faSun","faSync","faSyncAlt","faTachometerAlt","faTag","faTags","faThLarge","faTimes","faTools","faTrashAlt","faUpload","faUserCog","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fontAwesomeIcons","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/app.4cfd3d69.js.map.gz b/frontend-dist/js/app.4cfd3d69.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..0a889cb55123cdb298c676b903a5a647f43a71c2 GIT binary patch literal 18375 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/app.ae8d51dc.js.gz b/frontend-dist/js/app.ae8d51dc.js.gz deleted file mode 100644 index c7366afb6448e2478ecd1e790dffb6133735777f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25173 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 Ue@dV0^u-?k1A+=V@|i9H03kuDPyhe` diff --git a/frontend-dist/js/app.ae8d51dc.js.map.gz b/frontend-dist/js/app.ae8d51dc.js.map.gz deleted file mode 100644 index 8461f6052cafd88043ec0ccd5cb4926a96e93bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18379 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

oVycp03MyNQwSnj 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