您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
javbus 功能增强,增加稍后再看、已观看、收藏影片、收藏演员、去广告功能。更多功能持续更新中...
// ==UserScript== // @name javbus 巴士司机 - 开得稳,不翻车,带你嗨 // @namespace http://tampermonkey.net/ // @version 0.10.5 // @author heybro // @description javbus 功能增强,增加稍后再看、已观看、收藏影片、收藏演员、去广告功能。更多功能持续更新中... // @license GPL // @include https://*bus*/* // @include https://*jav*/* // @include https://*dmm*/* // @include https://*see*/* // @match https://www.javbus.com/* // @match https://www.dmmsee.art/* // @match https://www.buscdn.art/* // @match https://www.cdnbus.shop/* // @match https://www.busfan.shop/* // @match https://www.cdnbus.art/* // @match https://www.busdmm.shop/* // @match https://www.seejav.art/* // @require https://cdn.bootcdn.net/ajax/libs/vue/3.4.21/vue.global.prod.js // @require data:application/javascript,%3Bwindow.Vue%3DVue%3B // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @run-at document-start // ==/UserScript== (e=>{if(typeof GM_addStyle=="function"){GM_addStyle(e);return}const a=document.createElement("style");a.textContent=e,document.head.append(a)})(' @charset "UTF-8";:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","\u5FAE\u8F6F\u96C5\u9ED1",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645,.045,.355,1);--el-transition-function-fast-bezier:cubic-bezier(.23,1,.32,1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px}:root{color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,.04),0px 8px 20px rgba(0,0,0,.08);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,.12);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,.12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,.08),0px 12px 32px rgba(0,0,0,.12),0px 8px 16px -8px rgba(0,0,0,.16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0,0,0,.8);--el-overlay-color-light:rgba(0,0,0,.7);--el-overlay-color-lighter:rgba(0,0,0,.5);--el-mask-color:rgba(255,255,255,.9);--el-mask-color-extra-light:rgba(255,255,255,.3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.el-icon{--color:inherit;align-items:center;display:inline-flex;height:1em;justify-content:center;line-height:1em;position:relative;width:1em;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{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-small);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;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;-moz-user-select:none;-ms-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-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration);animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@-webkit-keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@-webkit-keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-overlay{background-color:var(--el-overlay-color-lighter);bottom:0;height:100%;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2000}.el-overlay .el-overlay-root{height:0}.infinite-list[data-v-5dbc0225]{height:800px;padding:0;margin:0;list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(167px,1fr));gap:10px;overflow-y:auto;overflow-x:hidden}#div-container[data-v-f6013da5]{position:absolute;right:30px;top:128px;display:block}.like-actress[data-v-f6013da5]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEf0lEQVR4nO1Y6U9UVxR//xF1ijIgwy6bwyaLQYLRFrC2tp8aPxiXuOOwCWljjNqiwRZKW62j0Lp0ZBEHBCSKS7T9IojKQFCIgGzH/G7y7sydeeC8N5MHQ+YkJ3kz953fPb93zj333CuFGIy0mlRabgeChAzBCBmXPW2Ca8gQLApGzWmQmraJHj1+Qv39jyl5Y2bgp5ztdivJgueAJpSXX0gLCwucEJ7zC7YFLqGbt2zkLjdu/huYhLJy8ml+ft6DEKKUk1cQeISa/77OSbx5M8xUFowFFKG0zFwhOqWWCjphqeS/MZa5aXPgELp6rZk77xgZoXXh0bTOGCVEyXq1KTAImdOzaW5ujjtuKaviY5byKiFK6Vl5K5/Q5b+sHtGRxxCl4WEHH7902bqyCSWlZtDMzIwzOuXO6MhaVnGSj8/OzrJOYkURWhMaQSnmLNqx8zuy2VqE6IRFxHi8j/8wxrsHWwuzBQawdCNkitnAdvnvd++hU6fP0vUbt1iPNjk5SUpSXlm9KFZFZY2iDaI7MDhIdnsXXfy1gQ4dKaWSnd/SxrRs+uzzcN8IJSSZ6bfGP1lTOT4+QWrE4XAoRkeIksO5lryR8fEJ5gt8ik80qyd0xdqkasKpqSl6+vQZNTX/w3q4T33Jzflb2buwga0auWK9pp5QfUOjBxBK7YuBQWpr76C6i/V09JiFSr7aRUkpGV6nhJLCFhjAAiawMceLgUHF9gm+qSa0PiqBHjzsF4DQ/oeGmXxeuN5qaJhJOH5A4BN801QUjOtj6V53jwCIL4f9RBcyNmfVhPT1PaAIU7xvVQ6kOrvuCcAdd+3ChulvXWs0UUtruzBn7/0+ioiM80/ZRlWyd4qkunvuU3hkrN/JsLnsXcJcPb3ezyWpmeiuvVPTV/NWlbKhu7tX1YeT1KbC7ZY21XntjcJp9/V6p0N9aqtufUCqta3do/IstZF6E333ioo51hpN+vRySuX0WGmZZkLHT5T7bXuQtDqBCd++e8edgFP+IARMX/Y6yZecd72i+rL4a81OFJV8w3GA6UuhkbQaFhR+IaRJTHyyZiei45IFrC2F2/UntO/AYe4AzjdacWQdGR3leHv3H9KfUO35Ou4ANt2l3o2KSWS61DuuGzewdSfU1n6HO1D3S73iO4kp6fT7H5fYpQm6ZhwKFzty40DnWrJ1JzQ09Io7cPDwcTEisUn0088XaHp6mpROpSAZl5Aq2OB0KsvLl0P6Egp3q3CF24p463Ky5keamPj0Cff9+0lGWj4KbN1e7JdKJ2kxQhVynTw2IYXd5oyNjXk4jn2lqvoHpq77liywgS0wXD+S1kon+VrhkEKvXr/2cBSXJ2fO1VJktPMwhmf8p3SxAgzXKzDMEaIXodoLzgrnLrhrwxpZ6iID+w5bYx8+LIqjtdJJvlY4WeQqZs7IUXUxCfJK9wZaK52kxQhnFPdmMjt3iyYHoLB1b3ZxlAjRi1Dxjl30/L//2VeUK5w/FFjABDb6uxC9CK1klZbbgSAhQzBCxmVPm+AaMqziovARGMODVG/9m4UAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:4px;box-sizing:border-box;opacity:.9;height:28px;width:28px;display:block;margin:0 2px}.like-actress.active[data-v-f6013da5]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAADMUlEQVR4nO2Zy08TURSH+28AFvpCImkzZWY6MxTxAWKVRy1ETU1cGQkL3JmQqAsx6kYWFYVqFaJC4ttFiRIEi+WhMcbHAhMXboxuXJmgMSqSHHPGFKF07Mw4c6dDZvFLJuncO+frOffcc8+1UbQAa0k2ow2wgGjLQ4LhYWOtIdpKCoLqMGioC0A64YLHCTds2xowf8ilLrhgcbZI1ETcbW6gPWEafs38gUHh8+4WxrxAE3H3EkxGY+fd5gRqbWJgYXolzJKXmhnzAY31eVbBZDR6zm0uoNbG3N7JCH9ra6LNA/Sgd/Xaydb9Xo85gFpCLCzMFOcFwnciO5nCBxqJSa+dbCVjnsIGag6x8HM6v3eWeym8gy0sID8jQKguAAejfpi8+LcqkCscg2NxDpyLGFDtRg6iu2g4fMAH/cc2iGl57kYZfEmVKIaQ0vd0EbxP2uHpoBOGT6+HE4e80L7PD00NrGxYSaBQPQt3e8rhzc0ymNfQaLWaT5WIttzpKRdtUwz0sC9/6jVKY30e5UDoHaMNX5QQekkxEK6Zuetlhhu/mCW0CW1TlRRqajh4PewoKJhN/4CRleUEgYdnV5yGw7wYckAwyGmTtnmBF1OpUTDPrzohWM1puw8FOF7sC5CGmR1wAsfz2m+sKJYTIBVXXg2o1dQlF3CcfBjFQBmo8X79PYWdooBCGFVAqCqGV1RVq9k4mYByGOp/ilOa5eHT6DrNYXBOnFutXTa1AzG25RzklArnVJIEKK2A9oZp3UIO+3nEgY52+HQDOtLhIw800F2hG9Dl7gryQOmEfvsRbuDEgT6O2HUD+pC0kwWqruZWNOG1Fs4tt3ajtADa31Yl27jP4yVwtqtSFD7LHYffoEgBdXd68xr0dbJYTBzLD2P4r8e6KmH+UX6w451eckBDp6Qz3I+pYrh9phzqt0jf1m2u5UTYb2npjfnayQpyQLnORtiAxxqsebv89i724hA+V3PyyaCTHNCrIceKBYyXWJFG9X1qHItdpuWJ5uWwgxxQe9QPb2+Vijd02HxUC5KtaIQWz1vv7pWK36BIARWybEYbYAHRlocEw8PGWkP0Gk4KvwFxSX3f7xMBpgAAAABJRU5ErkJggg==)}#div-container[data-v-60269620]{position:absolute;right:20px;bottom:10px;display:block}.watchlater[data-v-60269620]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIuNyIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgNC45MjlBNy4wNzEgNy4wNzEgMCAxMDE3IDE3YS42NDMuNjQzIDAgMDEuOTA4LjkxIDguMzU3IDguMzU3IDAgMTEyLjQ0NS02LjE3MmwuNjIxLS42MjJhLjY0My42NDMgMCAxMS45MS45MWwtMS43MTUgMS43MTRhLjY0My42NDMgMCAwMS0uOTEgMGwtMS43MTQtMS43MTVhLjY0My42NDMgMCAxMS45MS0uOTA5bC42MTEuNjEyQTcuMDcyIDcuMDcyIDAgMDAxMiA0LjkyOXptMi41NzEgNy44MTNhLjg1Ny44NTcgMCAwMDAtMS40ODVsLTMuMjE1LTEuODU2YS44NTcuODU3IDAgMDAtMS4yODYuNzQydjMuNzEzYS44NTcuODU3IDAgMDAxLjI4Ni43NDJsMy4yMTUtMS44NTZ6IiBmaWxsPSIjZmZmIi8+PHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzMzMyIgZmlsbC1vcGFjaXR5PSIuOCIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgNC45MjlBNy4wNzEgNy4wNzEgMCAxMDE3IDE3YS42NDMuNjQzIDAgMDEuOTA4LjkxIDguMzU3IDguMzU3IDAgMTEyLjQ0NS02LjE3MmwuNjIxLS42MjJhLjY0My42NDMgMCAxMS45MS45MWwtMS43MTUgMS43MTRhLjY0My42NDMgMCAwMS0uOTEgMGwtMS43MTQtMS43MTVhLjY0My42NDMgMCAxMS45MS0uOTA5bC42MTEuNjEyQTcuMDcyIDcuMDcyIDAgMDAxMiA0LjkyOXptMi41NzEgNy44MTNhLjg1Ny44NTcgMCAwMDAtMS40ODVsLTMuMjE1LTEuODU2YS44NTcuODU3IDAgMDAtMS4yODYuNzQydjMuNzEzYS44NTcuODU3IDAgMDAxLjI4Ni43NDJsMy4yMTUtMS44NTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+);background-position:50%;background-repeat:no-repeat;background-size:cover;opacity:.9;height:28px;width:28px;display:inline-block;vertical-align:bottom;margin:0 2px}.watchlater_tip[data-v-60269620]{background:#2f3238;border-radius:4px;box-sizing:border-box;color:#fff;font-size:12px;line-height:12px;opacity:.9;padding:6px 8px;position:absolute;right:-2px;top:32px;white-space:nowrap}.watchlater.active[data-v-60269620]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAChElEQVR4nO2Y70tTURjH73906qbrzrH5a5ZbTZq2Qq0wISKGiGIiZUGiFfUmXJuroKAi+4mRmi8Kox8vVknvNqUfNHOwKVhbtA03tm+cA/UiDNa9g3NP3gNfuBv3judzvs9zz7NHIrKC/0ES7wAMENlwROGePsSoEZn/ThPDEXkDOjJy5jxq6hvFBjl+4hToun3nnrggnr37kM1m8Tm6iCprvZgg1poGfFmK4Uc6DffuVu4ApFSQ3r4B1Nmd7HpzRRVevHyFYrHIvl/v/nBkHuVe4ci8NpBtjiasreWwFIuhyb0HY8Er7IevXrv+12d8/iDuP5goq3z+oHZHunuOsnpIpb6jUCgg9Potc4Z3KhE1NdK+vxOrq18RTyR087olakCoXLs8aG3v4B4w0Qqid0m8A9AFSEfnYciVFrFBDhw8hFwuh1vjd8UFqbM7sby8gmQqBaerWUwQudKCubl37Ew54u3mDkBKBWn2tKFiq/X35xs3x9npPuoLrHv/1PQMaynKqanpGW0gDY0udqKHQm9Yl9s/MMggZp89x6YtZnFAiKwgMHaZNYkfPn5COp1BNLoIi83OPZWImhoZPDmEfD6PTCaDFk8b96CJWhAqb1cP+vqPcQ+YaAXRuyTeAegCpNbuEB/EsdONb8kkLgYuiQtiUmwIhyPsTUYbR2FBJh5OsoNx5PQ57gCkVJA/51ZDw2cZxKPJx+IMH2y129kQjvZXdOBA/7vTqcrCwnuYzNXijINM5mrWV9H15Oks4vEE6712uFq4pxL519SiTtD5Ll20dfd29XIPmqgB+aULo37WQPIOmGgF0bsk3gEYILLhiMI9fYhRIzL/nSaGIzL/3SUb2ZGfrhAUx4/9ESkAAAAASUVORK5CYII=)}.add_watched[data-v-60269620]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVR4nO2Z0UoCQRSGfaOJCUvZ2gIlJFdN20AJAhGqB2jXjbqpXiDB3bu9yVJ8hApfQMSb1JuddzkxQREUUrlnh81z8d3/3z/nzDKaYDwFcSahOgAjAa6+RUYjxNU3yWiJ+RJco5qegYpZW5ji3gHwpBadgKZnodvrgxAiNKbTKTTPL6MR6IUc/jP1ximuwIaehSAI0AQ6911cgfJ+FS28EAIen55xBeTSkYD4xycwHA7h6vrmA8t2oGJW4yMwHo/B87wv1BvH8RZot9uwltbjK+B5HuTypXgLGMUKCQCdgKARAlpiQbeQoGuULe2HzCiZqAKj0QhXQP568DKZoAkMBgNcAYntXKCEn81m4Ps+voCk3jiBu87D2wvqHfkYkTP8W+TYyOb9OeFDF/gO+YKaF2BRDBLgak9gt1DGHaEzq4kW3nVdSKY2cQUKJRNNwLKdaP7kqx0ewW2rFWrzlu3AenorGgHJymoatjM5yO7kFyb5g7EJXUAlCdUBGAlw9S0yGiGuvklGS8zVt/kXXgGUPel8iSBFFQAAAABJRU5ErkJggg==);background-position:50%;background-repeat:no-repeat;background-size:cover;opacity:.9;height:28px;width:28px;display:inline-block;vertical-align:bottom;margin:0 2px}.add_watched.active[data-v-60269620]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGklEQVR4nO3ZPS9DURgH8H6j0x4lSGlQyoIUEQ0hwd5B43WwYEMTBteg6OAMJk3EgBgk4iVRgn4Em2q8NaGPPKVF2ty22qfn0jv8ly73/zvnOTc5twbGy+EvxyC7ANMBXP4qMn2EuPyVZPoh5kXwGi2vtkNjW1/OsTU7wVRqKRygsqYJpjcOQQQhb/FdPMPA6GxhAPku/z0dg25aAI4NVXkRBJhc3aUF2B29pID57RtaAB46HRD8JzswcRCBhbPXH795jh6BT50kYhrxg8nh0h5gbD8CZiUEVSv3PxCe01coUUJJMfXOaAcwjuWXP4rVrIZBOX9LCyhZvAVmtsgHqJUXagAlBEZbp1xAuvIiHcDeQwfAOe7afATfdVR15rFI7VoYlEByeSELsBx4ix1GfEireEhCZFpeyAJsBAEG/U+JB7WIB1i/imY8NtIB4hPRv/WFwJ1w775kvPLSASLFTsSTycprAiBSILIpL7QA+I7ItrzQCiCOWLlM/Ur9EwDxy3ioAXXNTlLA3DExgJdVgS/wRAYY3ovQAjD49YCivPcyClZvmB6AaR8Yil3A8QYVD15GcIazDY4NrrxVpXzeASnHa+pEtUCuMeoALnkHGrppRwgv4GSApTtgFQ3EAIeLDMDHdgrzJx9+PcALeN7LV9oLA4jFbIldwPGtkXMq6rN6tv43K5Mcg+wCTAdw+avI9BHi8leSFeshfgfgH5I3Zmn8CAAAAABJRU5ErkJggg==)}.star[data-v-60269620]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEf0lEQVR4nO1Y6U9UVxR//xF1ijIgwy6bwyaLQYLRFrC2tp8aPxiXuOOwCWljjNqiwRZKW62j0Lp0ZBEHBCSKS7T9IojKQFCIgGzH/G7y7sydeeC8N5MHQ+YkJ3kz953fPb93zj333CuFGIy0mlRabgeChAzBCBmXPW2Ca8gQLApGzWmQmraJHj1+Qv39jyl5Y2bgp5ztdivJgueAJpSXX0gLCwucEJ7zC7YFLqGbt2zkLjdu/huYhLJy8ml+ft6DEKKUk1cQeISa/77OSbx5M8xUFowFFKG0zFwhOqWWCjphqeS/MZa5aXPgELp6rZk77xgZoXXh0bTOGCVEyXq1KTAImdOzaW5ujjtuKaviY5byKiFK6Vl5K5/Q5b+sHtGRxxCl4WEHH7902bqyCSWlZtDMzIwzOuXO6MhaVnGSj8/OzrJOYkURWhMaQSnmLNqx8zuy2VqE6IRFxHi8j/8wxrsHWwuzBQawdCNkitnAdvnvd++hU6fP0vUbt1iPNjk5SUpSXlm9KFZFZY2iDaI7MDhIdnsXXfy1gQ4dKaWSnd/SxrRs+uzzcN8IJSSZ6bfGP1lTOT4+QWrE4XAoRkeIksO5lryR8fEJ5gt8ik80qyd0xdqkasKpqSl6+vQZNTX/w3q4T33Jzflb2buwga0auWK9pp5QfUOjBxBK7YuBQWpr76C6i/V09JiFSr7aRUkpGV6nhJLCFhjAAiawMceLgUHF9gm+qSa0PiqBHjzsF4DQ/oeGmXxeuN5qaJhJOH5A4BN801QUjOtj6V53jwCIL4f9RBcyNmfVhPT1PaAIU7xvVQ6kOrvuCcAdd+3ChulvXWs0UUtruzBn7/0+ioiM80/ZRlWyd4qkunvuU3hkrN/JsLnsXcJcPb3ezyWpmeiuvVPTV/NWlbKhu7tX1YeT1KbC7ZY21XntjcJp9/V6p0N9aqtufUCqta3do/IstZF6E333ioo51hpN+vRySuX0WGmZZkLHT5T7bXuQtDqBCd++e8edgFP+IARMX/Y6yZecd72i+rL4a81OFJV8w3GA6UuhkbQaFhR+IaRJTHyyZiei45IFrC2F2/UntO/AYe4AzjdacWQdGR3leHv3H9KfUO35Ou4ANt2l3o2KSWS61DuuGzewdSfU1n6HO1D3S73iO4kp6fT7H5fYpQm6ZhwKFzty40DnWrJ1JzQ09Io7cPDwcTEisUn0088XaHp6mpROpSAZl5Aq2OB0KsvLl0P6Egp3q3CF24p463Ky5keamPj0Cff9+0lGWj4KbN1e7JdKJ2kxQhVynTw2IYXd5oyNjXk4jn2lqvoHpq77liywgS0wXD+S1kon+VrhkEKvXr/2cBSXJ2fO1VJktPMwhmf8p3SxAgzXKzDMEaIXodoLzgrnLrhrwxpZ6iID+w5bYx8+LIqjtdJJvlY4WeQqZs7IUXUxCfJK9wZaK52kxQhnFPdmMjt3iyYHoLB1b3ZxlAjRi1Dxjl30/L//2VeUK5w/FFjABDb6uxC9CK1klZbbgSAhQzBCxmVPm+AaMqziovARGMODVG/9m4UAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:4px;box-sizing:border-box;opacity:.9;height:28px;width:28px;display:inline-block;vertical-align:bottom;margin:0 2px}.star.active[data-v-60269620]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAADMUlEQVR4nO2Zy08TURSH+28AFvpCImkzZWY6MxTxAWKVRy1ETU1cGQkL3JmQqAsx6kYWFYVqFaJC4ttFiRIEi+WhMcbHAhMXboxuXJmgMSqSHHPGFKF07Mw4c6dDZvFLJuncO+frOffcc8+1UbQAa0k2ow2wgGjLQ4LhYWOtIdpKCoLqMGioC0A64YLHCTds2xowf8ilLrhgcbZI1ETcbW6gPWEafs38gUHh8+4WxrxAE3H3EkxGY+fd5gRqbWJgYXolzJKXmhnzAY31eVbBZDR6zm0uoNbG3N7JCH9ra6LNA/Sgd/Xaydb9Xo85gFpCLCzMFOcFwnciO5nCBxqJSa+dbCVjnsIGag6x8HM6v3eWeym8gy0sID8jQKguAAejfpi8+LcqkCscg2NxDpyLGFDtRg6iu2g4fMAH/cc2iGl57kYZfEmVKIaQ0vd0EbxP2uHpoBOGT6+HE4e80L7PD00NrGxYSaBQPQt3e8rhzc0ymNfQaLWaT5WIttzpKRdtUwz0sC9/6jVKY30e5UDoHaMNX5QQekkxEK6Zuetlhhu/mCW0CW1TlRRqajh4PewoKJhN/4CRleUEgYdnV5yGw7wYckAwyGmTtnmBF1OpUTDPrzohWM1puw8FOF7sC5CGmR1wAsfz2m+sKJYTIBVXXg2o1dQlF3CcfBjFQBmo8X79PYWdooBCGFVAqCqGV1RVq9k4mYByGOp/ilOa5eHT6DrNYXBOnFutXTa1AzG25RzklArnVJIEKK2A9oZp3UIO+3nEgY52+HQDOtLhIw800F2hG9Dl7gryQOmEfvsRbuDEgT6O2HUD+pC0kwWqruZWNOG1Fs4tt3ajtADa31Yl27jP4yVwtqtSFD7LHYffoEgBdXd68xr0dbJYTBzLD2P4r8e6KmH+UX6w451eckBDp6Qz3I+pYrh9phzqt0jf1m2u5UTYb2npjfnayQpyQLnORtiAxxqsebv89i724hA+V3PyyaCTHNCrIceKBYyXWJFG9X1qHItdpuWJ5uWwgxxQe9QPb2+Vijd02HxUC5KtaIQWz1vv7pWK36BIARWybEYbYAHRlocEw8PGWkP0Gk4KvwFxSX3f7xMBpgAAAABJRU5ErkJggg==)}.watchlater[data-v-5cbfd23f]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIuNyIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgNC45MjlBNy4wNzEgNy4wNzEgMCAxMDE3IDE3YS42NDMuNjQzIDAgMDEuOTA4LjkxIDguMzU3IDguMzU3IDAgMTEyLjQ0NS02LjE3MmwuNjIxLS42MjJhLjY0My42NDMgMCAxMS45MS45MWwtMS43MTUgMS43MTRhLjY0My42NDMgMCAwMS0uOTEgMGwtMS43MTQtMS43MTVhLjY0My42NDMgMCAxMS45MS0uOTA5bC42MTEuNjEyQTcuMDcyIDcuMDcyIDAgMDAxMiA0LjkyOXptMi41NzEgNy44MTNhLjg1Ny44NTcgMCAwMDAtMS40ODVsLTMuMjE1LTEuODU2YS44NTcuODU3IDAgMDAtMS4yODYuNzQydjMuNzEzYS44NTcuODU3IDAgMDAxLjI4Ni43NDJsMy4yMTUtMS44NTZ6IiBmaWxsPSIjZmZmIi8+PHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzMzMyIgZmlsbC1vcGFjaXR5PSIuOCIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgNC45MjlBNy4wNzEgNy4wNzEgMCAxMDE3IDE3YS42NDMuNjQzIDAgMDEuOTA4LjkxIDguMzU3IDguMzU3IDAgMTEyLjQ0NS02LjE3MmwuNjIxLS42MjJhLjY0My42NDMgMCAxMS45MS45MWwtMS43MTUgMS43MTRhLjY0My42NDMgMCAwMS0uOTEgMGwtMS43MTQtMS43MTVhLjY0My42NDMgMCAxMS45MS0uOTA5bC42MTEuNjEyQTcuMDcyIDcuMDcyIDAgMDAxMiA0LjkyOXptMi41NzEgNy44MTNhLjg1Ny44NTcgMCAwMDAtMS40ODVsLTMuMjE1LTEuODU2YS44NTcuODU3IDAgMDAtMS4yODYuNzQydjMuNzEzYS44NTcuODU3IDAgMDAxLjI4Ni43NDJsMy4yMTUtMS44NTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+);background-position:50%;background-repeat:no-repeat;background-size:cover;opacity:.9;height:28px;width:28px;position:absolute;right:25px;top:22px;display:none}.watchlater_tip[data-v-5cbfd23f]{background:#2f3238;border-radius:4px;box-sizing:border-box;color:#fff;font-size:12px;line-height:12px;opacity:.9;padding:6px 8px;position:absolute;right:-2px;top:32px;white-space:nowrap;display:none}.watchlater.active[data-v-5cbfd23f]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAChElEQVR4nO2Y70tTURjH73906qbrzrH5a5ZbTZq2Qq0wISKGiGIiZUGiFfUmXJuroKAi+4mRmi8Kox8vVknvNqUfNHOwKVhbtA03tm+cA/UiDNa9g3NP3gNfuBv3judzvs9zz7NHIrKC/0ES7wAMENlwROGePsSoEZn/ThPDEXkDOjJy5jxq6hvFBjl+4hToun3nnrggnr37kM1m8Tm6iCprvZgg1poGfFmK4Uc6DffuVu4ApFSQ3r4B1Nmd7HpzRRVevHyFYrHIvl/v/nBkHuVe4ci8NpBtjiasreWwFIuhyb0HY8Er7IevXrv+12d8/iDuP5goq3z+oHZHunuOsnpIpb6jUCgg9Potc4Z3KhE1NdK+vxOrq18RTyR087olakCoXLs8aG3v4B4w0Qqid0m8A9AFSEfnYciVFrFBDhw8hFwuh1vjd8UFqbM7sby8gmQqBaerWUwQudKCubl37Ew54u3mDkBKBWn2tKFiq/X35xs3x9npPuoLrHv/1PQMaynKqanpGW0gDY0udqKHQm9Yl9s/MMggZp89x6YtZnFAiKwgMHaZNYkfPn5COp1BNLoIi83OPZWImhoZPDmEfD6PTCaDFk8b96CJWhAqb1cP+vqPcQ+YaAXRuyTeAegCpNbuEB/EsdONb8kkLgYuiQtiUmwIhyPsTUYbR2FBJh5OsoNx5PQ57gCkVJA/51ZDw2cZxKPJx+IMH2y129kQjvZXdOBA/7vTqcrCwnuYzNXijINM5mrWV9H15Oks4vEE6712uFq4pxL519SiTtD5Ll20dfd29XIPmqgB+aULo37WQPIOmGgF0bsk3gEYILLhiMI9fYhRIzL/nSaGIzL/3SUb2ZGfrhAUx4/9ESkAAAAASUVORK5CYII=)}.add_watched[data-v-5cbfd23f]{background:#2f3238;border-radius:4px;box-sizing:border-box;color:#fff;font-size:12px;line-height:12px;opacity:.9;padding:6px 8px;position:absolute;right:25px;top:195px;white-space:nowrap;display:none}.watched[data-v-5cbfd23f]{background:#2f3238;border-radius:4px;box-sizing:border-box;color:#fff;font-size:12px;line-height:12px;opacity:.9;padding:6px 8px;position:absolute;left:25px;top:195px;white-space:nowrap;display:none}.star[data-v-5cbfd23f]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEf0lEQVR4nO1Y6U9UVxR//xF1ijIgwy6bwyaLQYLRFrC2tp8aPxiXuOOwCWljjNqiwRZKW62j0Lp0ZBEHBCSKS7T9IojKQFCIgGzH/G7y7sydeeC8N5MHQ+YkJ3kz953fPb93zj333CuFGIy0mlRabgeChAzBCBmXPW2Ca8gQLApGzWmQmraJHj1+Qv39jyl5Y2bgp5ztdivJgueAJpSXX0gLCwucEJ7zC7YFLqGbt2zkLjdu/huYhLJy8ml+ft6DEKKUk1cQeISa/77OSbx5M8xUFowFFKG0zFwhOqWWCjphqeS/MZa5aXPgELp6rZk77xgZoXXh0bTOGCVEyXq1KTAImdOzaW5ujjtuKaviY5byKiFK6Vl5K5/Q5b+sHtGRxxCl4WEHH7902bqyCSWlZtDMzIwzOuXO6MhaVnGSj8/OzrJOYkURWhMaQSnmLNqx8zuy2VqE6IRFxHi8j/8wxrsHWwuzBQawdCNkitnAdvnvd++hU6fP0vUbt1iPNjk5SUpSXlm9KFZFZY2iDaI7MDhIdnsXXfy1gQ4dKaWSnd/SxrRs+uzzcN8IJSSZ6bfGP1lTOT4+QWrE4XAoRkeIksO5lryR8fEJ5gt8ik80qyd0xdqkasKpqSl6+vQZNTX/w3q4T33Jzflb2buwga0auWK9pp5QfUOjBxBK7YuBQWpr76C6i/V09JiFSr7aRUkpGV6nhJLCFhjAAiawMceLgUHF9gm+qSa0PiqBHjzsF4DQ/oeGmXxeuN5qaJhJOH5A4BN801QUjOtj6V53jwCIL4f9RBcyNmfVhPT1PaAIU7xvVQ6kOrvuCcAdd+3ChulvXWs0UUtruzBn7/0+ioiM80/ZRlWyd4qkunvuU3hkrN/JsLnsXcJcPb3ezyWpmeiuvVPTV/NWlbKhu7tX1YeT1KbC7ZY21XntjcJp9/V6p0N9aqtufUCqta3do/IstZF6E333ioo51hpN+vRySuX0WGmZZkLHT5T7bXuQtDqBCd++e8edgFP+IARMX/Y6yZecd72i+rL4a81OFJV8w3GA6UuhkbQaFhR+IaRJTHyyZiei45IFrC2F2/UntO/AYe4AzjdacWQdGR3leHv3H9KfUO35Ou4ANt2l3o2KSWS61DuuGzewdSfU1n6HO1D3S73iO4kp6fT7H5fYpQm6ZhwKFzty40DnWrJ1JzQ09Io7cPDwcTEisUn0088XaHp6mpROpSAZl5Aq2OB0KsvLl0P6Egp3q3CF24p463Ky5keamPj0Cff9+0lGWj4KbN1e7JdKJ2kxQhVynTw2IYXd5oyNjXk4jn2lqvoHpq77liywgS0wXD+S1kon+VrhkEKvXr/2cBSXJ2fO1VJktPMwhmf8p3SxAgzXKzDMEaIXodoLzgrnLrhrwxpZ6iID+w5bYx8+LIqjtdJJvlY4WeQqZs7IUXUxCfJK9wZaK52kxQhnFPdmMjt3iyYHoLB1b3ZxlAjRi1Dxjl30/L//2VeUK5w/FFjABDb6uxC9CK1klZbbgSAhQzBCxmVPm+AaMqziovARGMODVG/9m4UAAAAASUVORK5CYII=);background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:4px;box-sizing:border-box;opacity:.9;height:28px;width:28px;position:absolute;left:25px;top:22px;display:none}.star.active[data-v-5cbfd23f]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAAAsTAAALEwEAmpwYAAADMUlEQVR4nO2Zy08TURSH+28AFvpCImkzZWY6MxTxAWKVRy1ETU1cGQkL3JmQqAsx6kYWFYVqFaJC4ttFiRIEi+WhMcbHAhMXboxuXJmgMSqSHHPGFKF07Mw4c6dDZvFLJuncO+frOffcc8+1UbQAa0k2ow2wgGjLQ4LhYWOtIdpKCoLqMGioC0A64YLHCTds2xowf8ilLrhgcbZI1ETcbW6gPWEafs38gUHh8+4WxrxAE3H3EkxGY+fd5gRqbWJgYXolzJKXmhnzAY31eVbBZDR6zm0uoNbG3N7JCH9ra6LNA/Sgd/Xaydb9Xo85gFpCLCzMFOcFwnciO5nCBxqJSa+dbCVjnsIGag6x8HM6v3eWeym8gy0sID8jQKguAAejfpi8+LcqkCscg2NxDpyLGFDtRg6iu2g4fMAH/cc2iGl57kYZfEmVKIaQ0vd0EbxP2uHpoBOGT6+HE4e80L7PD00NrGxYSaBQPQt3e8rhzc0ymNfQaLWaT5WIttzpKRdtUwz0sC9/6jVKY30e5UDoHaMNX5QQekkxEK6Zuetlhhu/mCW0CW1TlRRqajh4PewoKJhN/4CRleUEgYdnV5yGw7wYckAwyGmTtnmBF1OpUTDPrzohWM1puw8FOF7sC5CGmR1wAsfz2m+sKJYTIBVXXg2o1dQlF3CcfBjFQBmo8X79PYWdooBCGFVAqCqGV1RVq9k4mYByGOp/ilOa5eHT6DrNYXBOnFutXTa1AzG25RzklArnVJIEKK2A9oZp3UIO+3nEgY52+HQDOtLhIw800F2hG9Dl7gryQOmEfvsRbuDEgT6O2HUD+pC0kwWqruZWNOG1Fs4tt3ajtADa31Yl27jP4yVwtqtSFD7LHYffoEgBdXd68xr0dbJYTBzLD2P4r8e6KmH+UX6w451eckBDp6Qz3I+pYrh9phzqt0jf1m2u5UTYb2npjfnayQpyQLnORtiAxxqsebv89i724hA+V3PyyaCTHNCrIceKBYyXWJFG9X1qHItdpuWJ5uWwgxxQe9QPb2+Vijd02HxUC5KtaIQWz1vv7pWK36BIARWybEYbYAHRlocEw8PGWkP0Gk4KvwFxSX3f7xMBpgAAAABJRU5ErkJggg==)} '); (function (vue) { 'use strict'; var isVue2 = false; /*! * pinia v2.1.7 * (c) 2023 Eduardo San Martin Morote * @license MIT */ let activePinia; const setActivePinia = (pinia) => activePinia = pinia; const piniaSymbol = ( /* istanbul ignore next */ Symbol() ); function isPlainObject(o) { return o && typeof o === "object" && Object.prototype.toString.call(o) === "[object Object]" && typeof o.toJSON !== "function"; } var MutationType; (function(MutationType2) { MutationType2["direct"] = "direct"; MutationType2["patchObject"] = "patch object"; MutationType2["patchFunction"] = "patch function"; })(MutationType || (MutationType = {})); function createPinia() { const scope = vue.effectScope(true); const state = scope.run(() => vue.ref({})); let _p = []; let toBeInstalled = []; const pinia = vue.markRaw({ install(app) { setActivePinia(pinia); { pinia._a = app; app.provide(piniaSymbol, pinia); app.config.globalProperties.$pinia = pinia; toBeInstalled.forEach((plugin) => _p.push(plugin)); toBeInstalled = []; } }, use(plugin) { if (!this._a && !isVue2) { toBeInstalled.push(plugin); } else { _p.push(plugin); } return this; }, _p, // it's actually undefined here // @ts-expect-error _a: null, _e: scope, _s: /* @__PURE__ */ new Map(), state }); return pinia; } const noop = () => { }; function addSubscription(subscriptions, callback, detached, onCleanup = noop) { subscriptions.push(callback); const removeSubscription = () => { const idx = subscriptions.indexOf(callback); if (idx > -1) { subscriptions.splice(idx, 1); onCleanup(); } }; if (!detached && vue.getCurrentScope()) { vue.onScopeDispose(removeSubscription); } return removeSubscription; } function triggerSubscriptions(subscriptions, ...args) { subscriptions.slice().forEach((callback) => { callback(...args); }); } const fallbackRunWithContext = (fn) => fn(); function mergeReactiveObjects(target, patchToApply) { if (target instanceof Map && patchToApply instanceof Map) { patchToApply.forEach((value, key) => target.set(key, value)); } if (target instanceof Set && patchToApply instanceof Set) { patchToApply.forEach(target.add, target); } for (const key in patchToApply) { if (!patchToApply.hasOwnProperty(key)) continue; const subPatch = patchToApply[key]; const targetValue = target[key]; if (isPlainObject(targetValue) && isPlainObject(subPatch) && target.hasOwnProperty(key) && !vue.isRef(subPatch) && !vue.isReactive(subPatch)) { target[key] = mergeReactiveObjects(targetValue, subPatch); } else { target[key] = subPatch; } } return target; } const skipHydrateSymbol = ( /* istanbul ignore next */ Symbol() ); function shouldHydrate(obj) { return !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol); } const { assign } = Object; function isComputed(o) { return !!(vue.isRef(o) && o.effect); } function createOptionsStore(id, options, pinia, hot) { const { state, actions, getters } = options; const initialState = pinia.state.value[id]; let store; function setup() { if (!initialState && true) { { pinia.state.value[id] = state ? state() : {}; } } const localState = vue.toRefs(pinia.state.value[id]); return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => { computedGetters[name] = vue.markRaw(vue.computed(() => { setActivePinia(pinia); const store2 = pinia._s.get(id); return getters[name].call(store2, store2); })); return computedGetters; }, {})); } store = createSetupStore(id, setup, options, pinia, hot, true); return store; } function createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) { let scope; const optionsForPlugin = assign({ actions: {} }, options); const $subscribeOptions = { deep: true // flush: 'post', }; let isListening; let isSyncListening; let subscriptions = []; let actionSubscriptions = []; let debuggerEvents; const initialState = pinia.state.value[$id]; if (!isOptionsStore && !initialState && true) { { pinia.state.value[$id] = {}; } } vue.ref({}); let activeListener; function $patch(partialStateOrMutator) { let subscriptionMutation; isListening = isSyncListening = false; if (typeof partialStateOrMutator === "function") { partialStateOrMutator(pinia.state.value[$id]); subscriptionMutation = { type: MutationType.patchFunction, storeId: $id, events: debuggerEvents }; } else { mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator); subscriptionMutation = { type: MutationType.patchObject, payload: partialStateOrMutator, storeId: $id, events: debuggerEvents }; } const myListenerId = activeListener = Symbol(); vue.nextTick().then(() => { if (activeListener === myListenerId) { isListening = true; } }); isSyncListening = true; triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]); } const $reset = isOptionsStore ? function $reset2() { const { state } = options; const newState = state ? state() : {}; this.$patch(($state) => { assign($state, newState); }); } : ( /* istanbul ignore next */ noop ); function $dispose() { scope.stop(); subscriptions = []; actionSubscriptions = []; pinia._s.delete($id); } function wrapAction(name, action) { return function() { setActivePinia(pinia); const args = Array.from(arguments); const afterCallbackList = []; const onErrorCallbackList = []; function after(callback) { afterCallbackList.push(callback); } function onError(callback) { onErrorCallbackList.push(callback); } triggerSubscriptions(actionSubscriptions, { args, name, store, after, onError }); let ret; try { ret = action.apply(this && this.$id === $id ? this : store, args); } catch (error) { triggerSubscriptions(onErrorCallbackList, error); throw error; } if (ret instanceof Promise) { return ret.then((value) => { triggerSubscriptions(afterCallbackList, value); return value; }).catch((error) => { triggerSubscriptions(onErrorCallbackList, error); return Promise.reject(error); }); } triggerSubscriptions(afterCallbackList, ret); return ret; }; } const partialStore = { _p: pinia, // _s: scope, $id, $onAction: addSubscription.bind(null, actionSubscriptions), $patch, $reset, $subscribe(callback, options2 = {}) { const removeSubscription = addSubscription(subscriptions, callback, options2.detached, () => stopWatcher()); const stopWatcher = scope.run(() => vue.watch(() => pinia.state.value[$id], (state) => { if (options2.flush === "sync" ? isSyncListening : isListening) { callback({ storeId: $id, type: MutationType.direct, events: debuggerEvents }, state); } }, assign({}, $subscribeOptions, options2))); return removeSubscription; }, $dispose }; const store = vue.reactive(partialStore); pinia._s.set($id, store); const runWithContext = pinia._a && pinia._a.runWithContext || fallbackRunWithContext; const setupStore = runWithContext(() => pinia._e.run(() => (scope = vue.effectScope()).run(setup))); for (const key in setupStore) { const prop = setupStore[key]; if (vue.isRef(prop) && !isComputed(prop) || vue.isReactive(prop)) { if (!isOptionsStore) { if (initialState && shouldHydrate(prop)) { if (vue.isRef(prop)) { prop.value = initialState[key]; } else { mergeReactiveObjects(prop, initialState[key]); } } { pinia.state.value[$id][key] = prop; } } } else if (typeof prop === "function") { const actionValue = wrapAction(key, prop); { setupStore[key] = actionValue; } optionsForPlugin.actions[key] = prop; } else ; } { assign(store, setupStore); assign(vue.toRaw(store), setupStore); } Object.defineProperty(store, "$state", { get: () => pinia.state.value[$id], set: (state) => { $patch(($state) => { assign($state, state); }); } }); pinia._p.forEach((extender) => { { assign(store, scope.run(() => extender({ store, app: pinia._a, pinia, options: optionsForPlugin }))); } }); if (initialState && isOptionsStore && options.hydrate) { options.hydrate(store.$state, initialState); } isListening = true; isSyncListening = true; return store; } function defineStore(idOrOptions, setup, setupOptions) { let id; let options; const isSetupStore = typeof setup === "function"; if (typeof idOrOptions === "string") { id = idOrOptions; options = isSetupStore ? setupOptions : setup; } else { options = idOrOptions; id = idOrOptions.id; } function useStore(pinia, hot) { const hasContext = vue.hasInjectionContext(); pinia = // in test mode, ignore the argument provided as we can always retrieve a // pinia instance with getActivePinia() pinia || (hasContext ? vue.inject(piniaSymbol, null) : null); if (pinia) setActivePinia(pinia); pinia = activePinia; if (!pinia._s.has(id)) { if (isSetupStore) { createSetupStore(id, setup, options, pinia); } else { createOptionsStore(id, options, pinia); } } const store = pinia._s.get(id); return store; } useStore.$id = id; return useStore; } function storeToRefs(store) { { store = vue.toRaw(store); const refs = {}; for (const key in store) { const value = store[key]; if (vue.isRef(value) || vue.isReactive(value)) { refs[key] = // --- vue.toRef(store, key); } } return refs; } } var _a; const isClient = typeof window !== "undefined"; isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && /iP(ad|hone|od)/.test(window.navigator.userAgent); function resolveUnref(r) { return typeof r === "function" ? r() : vue.unref(r); } function tryOnScopeDispose(fn) { if (vue.getCurrentScope()) { vue.onScopeDispose(fn); return true; } return false; } function useTimeoutFn(cb, interval, options = {}) { const { immediate = true } = options; const isPending = vue.ref(false); let timer = null; function clear() { if (timer) { clearTimeout(timer); timer = null; } } function stop() { isPending.value = false; clear(); } function start(...args) { clear(); isPending.value = true; timer = setTimeout(() => { isPending.value = false; timer = null; cb(...args); }, resolveUnref(interval)); } if (immediate) { isPending.value = true; if (isClient) start(); } tryOnScopeDispose(stop); return { isPending: vue.readonly(isPending), start, stop }; } const getOffsetTop = (el) => { let offset = 0; let parent = el; while (parent) { offset += parent.offsetTop; parent = parent.offsetParent; } return offset; }; const getOffsetTopDistance = (el, containerEl) => { return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl)); }; /** * @vue/shared v3.4.21 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ const NOOP = () => { }; const hasOwnProperty$4 = Object.prototype.hasOwnProperty; const hasOwn = (val, key) => hasOwnProperty$4.call(val, key); const isFunction$1 = (val) => typeof val === "function"; const isString = (val) => typeof val === "string"; const isSymbol$1 = (val) => typeof val === "symbol"; const isObject$1 = (val) => val !== null && typeof val === "object"; const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); return (str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); }; }; const camelizeRE = /-(\w)/g; const camelize = cacheStringFunction((str) => { return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); }); const hasChanged = (value, oldValue) => !Object.is(value, oldValue); var freeGlobal = typeof global == "object" && global && global.Object === Object && global; var freeSelf = typeof self == "object" && self && self.Object === Object && self; var root = freeGlobal || freeSelf || Function("return this")(); var Symbol$1 = root.Symbol; var objectProto$4 = Object.prototype; var hasOwnProperty$3 = objectProto$4.hasOwnProperty; var nativeObjectToString$1 = objectProto$4.toString; var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : void 0; function getRawTag(value) { var isOwn = hasOwnProperty$3.call(value, symToStringTag$1), tag = value[symToStringTag$1]; try { value[symToStringTag$1] = void 0; var unmasked = true; } catch (e) { } var result = nativeObjectToString$1.call(value); if (unmasked) { if (isOwn) { value[symToStringTag$1] = tag; } else { delete value[symToStringTag$1]; } } return result; } var objectProto$3 = Object.prototype; var nativeObjectToString = objectProto$3.toString; function objectToString(value) { return nativeObjectToString.call(value); } var nullTag = "[object Null]", undefinedTag = "[object Undefined]"; var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0; function baseGetTag(value) { if (value == null) { return value === void 0 ? undefinedTag : nullTag; } return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } function isObjectLike(value) { return value != null && typeof value == "object"; } var symbolTag = "[object Symbol]"; function isSymbol(value) { return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag; } function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } var isArray = Array.isArray; var INFINITY$1 = 1 / 0; var symbolProto = Symbol$1 ? Symbol$1.prototype : void 0, symbolToString = symbolProto ? symbolProto.toString : void 0; function baseToString(value) { if (typeof value == "string") { return value; } if (isArray(value)) { return arrayMap(value, baseToString) + ""; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ""; } var result = value + ""; return result == "0" && 1 / value == -INFINITY$1 ? "-0" : result; } var reWhitespace = /\s/; function trimmedEndIndex(string) { var index = string.length; while (index-- && reWhitespace.test(string.charAt(index))) { } return index; } var reTrimStart = /^\s+/; function baseTrim(string) { return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; } function isObject(value) { var type = typeof value; return value != null && (type == "object" || type == "function"); } var NAN = 0 / 0; var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; var reIsBinary = /^0b[01]+$/i; var reIsOctal = /^0o[0-7]+$/i; var freeParseInt = parseInt; function toNumber(value) { if (typeof value == "number") { return value; } if (isSymbol(value)) { return NAN; } if (isObject(value)) { var other = typeof value.valueOf == "function" ? value.valueOf() : value; value = isObject(other) ? other + "" : other; } if (typeof value != "string") { return value === 0 ? value : +value; } value = baseTrim(value); var isBinary = reIsBinary.test(value); return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } var asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]"; function isFunction(value) { if (!isObject(value)) { return false; } var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } var coreJsData = root["__core-js_shared__"]; var maskSrcKey = function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); return uid ? "Symbol(src)_1." + uid : ""; }(); function isMasked(func) { return !!maskSrcKey && maskSrcKey in func; } var funcProto$1 = Function.prototype; var funcToString$1 = funcProto$1.toString; function toSource(func) { if (func != null) { try { return funcToString$1.call(func); } catch (e) { } try { return func + ""; } catch (e) { } } return ""; } var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; var reIsHostCtor = /^\[object .+?Constructor\]$/; var funcProto = Function.prototype, objectProto$2 = Object.prototype; var funcToString = funcProto.toString; var hasOwnProperty$2 = objectProto$2.hasOwnProperty; var reIsNative = RegExp( "^" + funcToString.call(hasOwnProperty$2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" ); function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } function getValue(object, key) { return object == null ? void 0 : object[key]; } function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : void 0; } function eq(value, other) { return value === other || value !== value && other !== other; } var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object); } var nativeCreate = getNative(Object, "create"); function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } var HASH_UNDEFINED$1 = "__lodash_hash_undefined__"; var objectProto$1 = Object.prototype; var hasOwnProperty$1 = objectProto$1.hasOwnProperty; function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED$1 ? void 0 : result; } return hasOwnProperty$1.call(data, key) ? data[key] : void 0; } var objectProto = Object.prototype; var hasOwnProperty = objectProto.hasOwnProperty; function hashHas(key) { var data = this.__data__; return nativeCreate ? data[key] !== void 0 : hasOwnProperty.call(data, key); } var HASH_UNDEFINED = "__lodash_hash_undefined__"; function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = nativeCreate && value === void 0 ? HASH_UNDEFINED : value; return this; } function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } Hash.prototype.clear = hashClear; Hash.prototype["delete"] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; function listCacheClear() { this.__data__ = []; this.size = 0; } function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } var arrayProto = Array.prototype; var splice = arrayProto.splice; function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? void 0 : data[index][1]; } function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } ListCache.prototype.clear = listCacheClear; ListCache.prototype["delete"] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; var Map$1 = getNative(root, "Map"); function mapCacheClear() { this.size = 0; this.__data__ = { "hash": new Hash(), "map": new (Map$1 || ListCache)(), "string": new Hash() }; } function isKeyable(value) { var type = typeof value; return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; } function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; } function mapCacheDelete(key) { var result = getMapData(this, key)["delete"](key); this.size -= result ? 1 : 0; return result; } function mapCacheGet(key) { return getMapData(this, key).get(key); } function mapCacheHas(key) { return getMapData(this, key).has(key); } function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } MapCache.prototype.clear = mapCacheClear; MapCache.prototype["delete"] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; var FUNC_ERROR_TEXT$2 = "Expected a function"; function memoize(func, resolver) { if (typeof func != "function" || resolver != null && typeof resolver != "function") { throw new TypeError(FUNC_ERROR_TEXT$2); } var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache)(); return memoized; } memoize.Cache = MapCache; var MAX_MEMOIZE_SIZE = 500; function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; var reEscapeChar = /\\(\\)?/g; var stringToPath = memoizeCapped(function(string) { var result = []; if (string.charCodeAt(0) === 46) { result.push(""); } string.replace(rePropName, function(match, number, quote, subString) { result.push(quote ? subString.replace(reEscapeChar, "$1") : number || match); }); return result; }); function toString(value) { return value == null ? "" : baseToString(value); } function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } var INFINITY = 1 / 0; function toKey(value) { if (typeof value == "string" || isSymbol(value)) { return value; } var result = value + ""; return result == "0" && 1 / value == -INFINITY ? "-0" : result; } function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return index && index == length ? object : void 0; } function get(object, path, defaultValue) { var result = object == null ? void 0 : baseGet(object, path); return result === void 0 ? defaultValue : result; } var now = function() { return root.Date.now(); }; var FUNC_ERROR_TEXT$1 = "Expected a function"; var nativeMax = Math.max, nativeMin = Math.min; function debounce(func, wait, options) { var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; if (typeof func != "function") { throw new TypeError(FUNC_ERROR_TEXT$1); } wait = toNumber(wait) || 0; if (isObject(options)) { leading = !!options.leading; maxing = "maxWait" in options; maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; trailing = "trailing" in options ? !!options.trailing : trailing; } function invokeFunc(time) { var args = lastArgs, thisArg = lastThis; lastArgs = lastThis = void 0; lastInvokeTime = time; result = func.apply(thisArg, args); return result; } function leadingEdge(time) { lastInvokeTime = time; timerId = setTimeout(timerExpired, wait); return leading ? invokeFunc(time) : result; } function remainingWait(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; } function shouldInvoke(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; } function timerExpired() { var time = now(); if (shouldInvoke(time)) { return trailingEdge(time); } timerId = setTimeout(timerExpired, remainingWait(time)); } function trailingEdge(time) { timerId = void 0; if (trailing && lastArgs) { return invokeFunc(time); } lastArgs = lastThis = void 0; return result; } function cancel() { if (timerId !== void 0) { clearTimeout(timerId); } lastInvokeTime = 0; lastArgs = lastCallTime = lastThis = timerId = void 0; } function flush() { return timerId === void 0 ? result : trailingEdge(now()); } function debounced() { var time = now(), isInvoking = shouldInvoke(time); lastArgs = arguments; lastThis = this; lastCallTime = time; if (isInvoking) { if (timerId === void 0) { return leadingEdge(lastCallTime); } if (maxing) { clearTimeout(timerId); timerId = setTimeout(timerExpired, wait); return invokeFunc(lastCallTime); } } if (timerId === void 0) { timerId = setTimeout(timerExpired, wait); } return result; } debounced.cancel = cancel; debounced.flush = flush; return debounced; } function fromPairs(pairs) { var index = -1, length = pairs == null ? 0 : pairs.length, result = {}; while (++index < length) { var pair = pairs[index]; result[pair[0]] = pair[1]; } return result; } function isNil(value) { return value == null; } function isUndefined$1(value) { return value === void 0; } var FUNC_ERROR_TEXT = "Expected a function"; function throttle(func, wait, options) { var leading = true, trailing = true; if (typeof func != "function") { throw new TypeError(FUNC_ERROR_TEXT); } if (isObject(options)) { leading = "leading" in options ? !!options.leading : leading; trailing = "trailing" in options ? !!options.trailing : trailing; } return debounce(func, wait, { "leading": leading, "maxWait": wait, "trailing": trailing }); } const isUndefined = (val) => val === void 0; const isBoolean = (val) => typeof val === "boolean"; const isNumber = (val) => typeof val === "number"; const isStringNumber = (val) => { if (!isString(val)) { return false; } return !Number.isNaN(Number(val)); }; class ElementPlusError extends Error { constructor(m) { super(m); this.name = "ElementPlusError"; } } function throwError(scope, m) { throw new ElementPlusError(`[${scope}] ${m}`); } const classNameToArray = (cls = "") => cls.split(" ").filter((item) => !!item.trim()); const hasClass = (el, cls) => { if (!el || !cls) return false; if (cls.includes(" ")) throw new Error("className should not contain space."); return el.classList.contains(cls); }; const addClass = (el, cls) => { if (!el || !cls.trim()) return; el.classList.add(...classNameToArray(cls)); }; const removeClass = (el, cls) => { if (!el || !cls.trim()) return; el.classList.remove(...classNameToArray(cls)); }; const getStyle = (element, styleName) => { var _a2; if (!isClient || !element || !styleName) return ""; let key = camelize(styleName); if (key === "float") key = "cssFloat"; try { const style = element.style[key]; if (style) return style; const computed2 = (_a2 = document.defaultView) == null ? void 0 : _a2.getComputedStyle(element, ""); return computed2 ? computed2[key] : ""; } catch (e) { return element.style[key]; } }; function addUnit(value, defaultUnit = "px") { if (!value) return ""; if (isNumber(value) || isStringNumber(value)) { return `${value}${defaultUnit}`; } else if (isString(value)) { return value; } } const isScroll = (el, isVertical) => { if (!isClient) return false; const key = { undefined: "overflow", true: "overflow-y", false: "overflow-x" }[String(isVertical)]; const overflow = getStyle(el, key); return ["scroll", "auto", "overlay"].some((s) => overflow.includes(s)); }; const getScrollContainer = (el, isVertical) => { if (!isClient) return; let parent = el; while (parent) { if ([window, document, document.documentElement].includes(parent)) return window; if (isScroll(parent, isVertical)) return parent; parent = parent.parentNode; } return parent; }; let scrollBarWidth; const getScrollBarWidth = (namespace) => { var _a2; if (!isClient) return 0; if (scrollBarWidth !== void 0) return scrollBarWidth; const outer = document.createElement("div"); outer.className = `${namespace}-scrollbar__wrap`; outer.style.visibility = "hidden"; outer.style.width = "100px"; outer.style.position = "absolute"; outer.style.top = "-9999px"; document.body.appendChild(outer); const widthNoScroll = outer.offsetWidth; outer.style.overflow = "scroll"; const inner = document.createElement("div"); inner.style.width = "100%"; outer.appendChild(inner); const widthWithScroll = inner.offsetWidth; (_a2 = outer.parentNode) == null ? void 0 : _a2.removeChild(outer); scrollBarWidth = widthNoScroll - widthWithScroll; return scrollBarWidth; }; /*! Element Plus Icons Vue v2.3.1 */ var close_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ vue.defineComponent({ name: "Close", __name: "close", setup(__props) { return (_ctx, _cache) => (vue.openBlock(), vue.createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [ vue.createElementVNode("path", { fill: "currentColor", d: "M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z" }) ])); } }); var close_default = close_vue_vue_type_script_setup_true_lang_default; const epPropKey = "__epPropKey"; const definePropType = (val) => val; const isEpProp = (val) => isObject$1(val) && !!val[epPropKey]; const buildProp = (prop, key) => { if (!isObject$1(prop) || isEpProp(prop)) return prop; const { values, required, default: defaultValue, type, validator } = prop; const _validator = values || validator ? (val) => { let valid = false; let allowedValues = []; if (values) { allowedValues = Array.from(values); if (hasOwn(prop, "default")) { allowedValues.push(defaultValue); } valid || (valid = allowedValues.includes(val)); } if (validator) valid || (valid = validator(val)); if (!valid && allowedValues.length > 0) { const allowValuesText = [...new Set(allowedValues)].map((value) => JSON.stringify(value)).join(", "); vue.warn(`Invalid prop: validation failed${key ? ` for prop "${key}"` : ""}. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`); } return valid; } : void 0; const epProp = { type, required: !!required, validator: _validator, [epPropKey]: true }; if (hasOwn(prop, "default")) epProp.default = defaultValue; return epProp; }; const buildProps = (props) => fromPairs(Object.entries(props).map(([key, option]) => [ key, buildProp(option, key) ])); const iconPropType = definePropType([ String, Object, Function ]); const CloseComponents = { Close: close_default }; const withInstall = (main, extra) => { main.install = (app) => { for (const comp of [main, ...Object.values(extra != null ? extra : {})]) { app.component(comp.name, comp); } }; if (extra) { for (const [key, comp] of Object.entries(extra)) { main[key] = comp; } } return main; }; const composeRefs = (...refs) => { return (el) => { refs.forEach((ref2) => { if (isFunction$1(ref2)) { ref2(el); } else { ref2.value = el; } }); }; }; const EVENT_CODE = { tab: "Tab", enter: "Enter", space: "Space", left: "ArrowLeft", up: "ArrowUp", right: "ArrowRight", down: "ArrowDown", esc: "Escape", delete: "Delete", backspace: "Backspace", numpadEnter: "NumpadEnter", pageUp: "PageUp", pageDown: "PageDown", home: "Home", end: "End" }; const UPDATE_MODEL_EVENT = "update:modelValue"; var PatchFlags = /* @__PURE__ */ ((PatchFlags2) => { PatchFlags2[PatchFlags2["TEXT"] = 1] = "TEXT"; PatchFlags2[PatchFlags2["CLASS"] = 2] = "CLASS"; PatchFlags2[PatchFlags2["STYLE"] = 4] = "STYLE"; PatchFlags2[PatchFlags2["PROPS"] = 8] = "PROPS"; PatchFlags2[PatchFlags2["FULL_PROPS"] = 16] = "FULL_PROPS"; PatchFlags2[PatchFlags2["HYDRATE_EVENTS"] = 32] = "HYDRATE_EVENTS"; PatchFlags2[PatchFlags2["STABLE_FRAGMENT"] = 64] = "STABLE_FRAGMENT"; PatchFlags2[PatchFlags2["KEYED_FRAGMENT"] = 128] = "KEYED_FRAGMENT"; PatchFlags2[PatchFlags2["UNKEYED_FRAGMENT"] = 256] = "UNKEYED_FRAGMENT"; PatchFlags2[PatchFlags2["NEED_PATCH"] = 512] = "NEED_PATCH"; PatchFlags2[PatchFlags2["DYNAMIC_SLOTS"] = 1024] = "DYNAMIC_SLOTS"; PatchFlags2[PatchFlags2["HOISTED"] = -1] = "HOISTED"; PatchFlags2[PatchFlags2["BAIL"] = -2] = "BAIL"; return PatchFlags2; })(PatchFlags || {}); const useDeprecated = ({ from, replacement, scope, version, ref: ref2, type = "API" }, condition) => { vue.watch(() => vue.unref(condition), (val) => { }, { immediate: true }); }; const useDraggable = (targetRef, dragRef, draggable, overflow) => { let transform = { offsetX: 0, offsetY: 0 }; const onMousedown = (e) => { const downX = e.clientX; const downY = e.clientY; const { offsetX, offsetY } = transform; const targetRect = targetRef.value.getBoundingClientRect(); const targetLeft = targetRect.left; const targetTop = targetRect.top; const targetWidth = targetRect.width; const targetHeight = targetRect.height; const clientWidth = document.documentElement.clientWidth; const clientHeight = document.documentElement.clientHeight; const minLeft = -targetLeft + offsetX; const minTop = -targetTop + offsetY; const maxLeft = clientWidth - targetLeft - targetWidth + offsetX; const maxTop = clientHeight - targetTop - targetHeight + offsetY; const onMousemove = (e2) => { let moveX = offsetX + e2.clientX - downX; let moveY = offsetY + e2.clientY - downY; if (!(overflow == null ? void 0 : overflow.value)) { moveX = Math.min(Math.max(moveX, minLeft), maxLeft); moveY = Math.min(Math.max(moveY, minTop), maxTop); } transform = { offsetX: moveX, offsetY: moveY }; if (targetRef.value) { targetRef.value.style.transform = `translate(${addUnit(moveX)}, ${addUnit(moveY)})`; } }; const onMouseup = () => { document.removeEventListener("mousemove", onMousemove); document.removeEventListener("mouseup", onMouseup); }; document.addEventListener("mousemove", onMousemove); document.addEventListener("mouseup", onMouseup); }; const onDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.addEventListener("mousedown", onMousedown); } }; const offDraggable = () => { if (dragRef.value && targetRef.value) { dragRef.value.removeEventListener("mousedown", onMousedown); } }; vue.onMounted(() => { vue.watchEffect(() => { if (draggable.value) { onDraggable(); } else { offDraggable(); } }); }); vue.onBeforeUnmount(() => { offDraggable(); }); }; var English = { name: "en", el: { breadcrumb: { label: "Breadcrumb" }, colorpicker: { confirm: "OK", clear: "Clear", defaultLabel: "color picker", description: "current color is {color}. press enter to select a new color." }, datepicker: { now: "Now", today: "Today", cancel: "Cancel", clear: "Clear", confirm: "OK", dateTablePrompt: "Use the arrow keys and enter to select the day of the month", monthTablePrompt: "Use the arrow keys and enter to select the month", yearTablePrompt: "Use the arrow keys and enter to select the year", selectedDate: "Selected date", selectDate: "Select date", selectTime: "Select time", startDate: "Start Date", startTime: "Start Time", endDate: "End Date", endTime: "End Time", prevYear: "Previous Year", nextYear: "Next Year", prevMonth: "Previous Month", nextMonth: "Next Month", year: "", month1: "January", month2: "February", month3: "March", month4: "April", month5: "May", month6: "June", month7: "July", month8: "August", month9: "September", month10: "October", month11: "November", month12: "December", week: "week", weeks: { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", fri: "Fri", sat: "Sat" }, weeksFull: { sun: "Sunday", mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday" }, months: { jan: "Jan", feb: "Feb", mar: "Mar", apr: "Apr", may: "May", jun: "Jun", jul: "Jul", aug: "Aug", sep: "Sep", oct: "Oct", nov: "Nov", dec: "Dec" } }, inputNumber: { decrease: "decrease number", increase: "increase number" }, select: { loading: "Loading", noMatch: "No matching data", noData: "No data", placeholder: "Select" }, dropdown: { toggleDropdown: "Toggle Dropdown" }, cascader: { noMatch: "No matching data", loading: "Loading", placeholder: "Select", noData: "No data" }, pagination: { goto: "Go to", pagesize: "/page", total: "Total {total}", pageClassifier: "", page: "Page", prev: "Go to previous page", next: "Go to next page", currentPage: "page {pager}", prevPages: "Previous {pager} pages", nextPages: "Next {pager} pages", deprecationWarning: "Deprecated usages detected, please refer to the el-pagination documentation for more details" }, dialog: { close: "Close this dialog" }, drawer: { close: "Close this dialog" }, messagebox: { title: "Message", confirm: "OK", cancel: "Cancel", error: "Illegal input", close: "Close this dialog" }, upload: { deleteTip: "press delete to remove", delete: "Delete", preview: "Preview", continue: "Continue" }, slider: { defaultLabel: "slider between {min} and {max}", defaultRangeStartLabel: "pick start value", defaultRangeEndLabel: "pick end value" }, table: { emptyText: "No Data", confirmFilter: "Confirm", resetFilter: "Reset", clearFilter: "All", sumText: "Sum" }, tour: { next: "Next", previous: "Previous", finish: "Finish" }, tree: { emptyText: "No Data" }, transfer: { noMatch: "No matching data", noData: "No data", titles: ["List 1", "List 2"], filterPlaceholder: "Enter keyword", noCheckedFormat: "{total} items", hasCheckedFormat: "{checked}/{total} checked" }, image: { error: "FAILED" }, pageHeader: { title: "Back" }, popconfirm: { confirmButtonText: "Yes", cancelButtonText: "No" }, carousel: { leftArrow: "Carousel arrow left", rightArrow: "Carousel arrow right", indicator: "Carousel switch to index {index}" } } }; const buildTranslator = (locale) => (path, option) => translate(path, option, vue.unref(locale)); const translate = (path, option, locale) => get(locale, path, path).replace(/\{(\w+)\}/g, (_, key) => { var _a2; return `${(_a2 = option == null ? void 0 : option[key]) != null ? _a2 : `{${key}}`}`; }); const buildLocaleContext = (locale) => { const lang = vue.computed(() => vue.unref(locale).name); const localeRef = vue.isRef(locale) ? locale : vue.ref(locale); return { lang, locale: localeRef, t: buildTranslator(locale) }; }; const localeContextKey = Symbol("localeContextKey"); const useLocale = (localeOverrides) => { const locale = localeOverrides || vue.inject(localeContextKey, vue.ref()); return buildLocaleContext(vue.computed(() => locale.value || English)); }; /** * @vue/reactivity v3.4.21 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let activeEffectScope; function recordEffectScope(effect2, scope = activeEffectScope) { if (scope && scope.active) { scope.effects.push(effect2); } } let activeEffect; class ReactiveEffect { constructor(fn, trigger2, scheduler, scope) { this.fn = fn; this.trigger = trigger2; this.scheduler = scheduler; this.active = true; this.deps = []; this._dirtyLevel = 4; this._trackId = 0; this._runnings = 0; this._shouldSchedule = false; this._depsLength = 0; recordEffectScope(this, scope); } get dirty() { if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { this._dirtyLevel = 1; pauseTracking(); for (let i = 0; i < this._depsLength; i++) { const dep = this.deps[i]; if (dep.computed) { triggerComputed(dep.computed); if (this._dirtyLevel >= 4) { break; } } } if (this._dirtyLevel === 1) { this._dirtyLevel = 0; } resetTracking(); } return this._dirtyLevel >= 4; } set dirty(v) { this._dirtyLevel = v ? 4 : 0; } run() { this._dirtyLevel = 0; if (!this.active) { return this.fn(); } let lastShouldTrack = shouldTrack; let lastEffect = activeEffect; try { shouldTrack = true; activeEffect = this; this._runnings++; preCleanupEffect(this); return this.fn(); } finally { postCleanupEffect(this); this._runnings--; activeEffect = lastEffect; shouldTrack = lastShouldTrack; } } stop() { var _a2; if (this.active) { preCleanupEffect(this); postCleanupEffect(this); (_a2 = this.onStop) == null ? void 0 : _a2.call(this); this.active = false; } } } function triggerComputed(computed2) { return computed2.value; } function preCleanupEffect(effect2) { effect2._trackId++; effect2._depsLength = 0; } function postCleanupEffect(effect2) { if (effect2.deps.length > effect2._depsLength) { for (let i = effect2._depsLength; i < effect2.deps.length; i++) { cleanupDepEffect(effect2.deps[i], effect2); } effect2.deps.length = effect2._depsLength; } } function cleanupDepEffect(dep, effect2) { const trackId = dep.get(effect2); if (trackId !== void 0 && effect2._trackId !== trackId) { dep.delete(effect2); if (dep.size === 0) { dep.cleanup(); } } } let shouldTrack = true; let pauseScheduleStack = 0; const trackStack = []; function pauseTracking() { trackStack.push(shouldTrack); shouldTrack = false; } function resetTracking() { const last = trackStack.pop(); shouldTrack = last === void 0 ? true : last; } function pauseScheduling() { pauseScheduleStack++; } function resetScheduling() { pauseScheduleStack--; while (!pauseScheduleStack && queueEffectSchedulers.length) { queueEffectSchedulers.shift()(); } } function trackEffect(effect2, dep, debuggerEventExtraInfo) { if (dep.get(effect2) !== effect2._trackId) { dep.set(effect2, effect2._trackId); const oldDep = effect2.deps[effect2._depsLength]; if (oldDep !== dep) { if (oldDep) { cleanupDepEffect(oldDep, effect2); } effect2.deps[effect2._depsLength++] = dep; } else { effect2._depsLength++; } } } const queueEffectSchedulers = []; function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { pauseScheduling(); for (const effect2 of dep.keys()) { let tracking; if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); effect2._dirtyLevel = dirtyLevel; } if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { effect2.trigger(); if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { effect2._shouldSchedule = false; if (effect2.scheduler) { queueEffectSchedulers.push(effect2.scheduler); } } } } resetScheduling(); } const createDep = (cleanup, computed2) => { const dep = /* @__PURE__ */ new Map(); dep.cleanup = cleanup; dep.computed = computed2; return dep; }; new Set( /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol$1) ); function toRaw(observed) { const raw = observed && observed["__v_raw"]; return raw ? toRaw(raw) : observed; } class ComputedRefImpl { constructor(getter, _setter, isReadonly2, isSSR) { this.getter = getter; this._setter = _setter; this.dep = void 0; this.__v_isRef = true; this["__v_isReadonly"] = false; this.effect = new ReactiveEffect( () => getter(this._value), () => triggerRefValue( this, this.effect._dirtyLevel === 2 ? 2 : 3 ) ); this.effect.computed = this; this.effect.active = this._cacheable = !isSSR; this["__v_isReadonly"] = isReadonly2; } get value() { const self2 = toRaw(this); if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) { triggerRefValue(self2, 4); } trackRefValue(self2); if (self2.effect._dirtyLevel >= 2) { triggerRefValue(self2, 2); } return self2._value; } set value(newValue) { this._setter(newValue); } // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x get _dirty() { return this.effect.dirty; } set _dirty(v) { this.effect.dirty = v; } // #endregion } function computed(getterOrOptions, debugOptions, isSSR = false) { let getter; let setter; const onlyGetter = isFunction$1(getterOrOptions); if (onlyGetter) { getter = getterOrOptions; setter = NOOP; } else { getter = getterOrOptions.get; setter = getterOrOptions.set; } const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); return cRef; } function trackRefValue(ref2) { var _a2; if (shouldTrack && activeEffect) { ref2 = toRaw(ref2); trackEffect( activeEffect, (_a2 = ref2.dep) != null ? _a2 : ref2.dep = createDep( () => ref2.dep = void 0, ref2 instanceof ComputedRefImpl ? ref2 : void 0 ) ); } } function triggerRefValue(ref2, dirtyLevel = 4, newVal) { ref2 = toRaw(ref2); const dep = ref2.dep; if (dep) { triggerEffects( dep, dirtyLevel ); } } const defaultNamespace = "el"; const statePrefix = "is-"; const _bem = (namespace, block, blockSuffix, element, modifier) => { let cls = `${namespace}-${block}`; if (blockSuffix) { cls += `-${blockSuffix}`; } if (element) { cls += `__${element}`; } if (modifier) { cls += `--${modifier}`; } return cls; }; const namespaceContextKey = Symbol("namespaceContextKey"); const useGetDerivedNamespace = (namespaceOverrides) => { const derivedNamespace = namespaceOverrides || (vue.getCurrentInstance() ? vue.inject(namespaceContextKey, vue.ref(defaultNamespace)) : vue.ref(defaultNamespace)); const namespace = vue.computed(() => { return vue.unref(derivedNamespace) || defaultNamespace; }); return namespace; }; const useNamespace = (block, namespaceOverrides) => { const namespace = useGetDerivedNamespace(namespaceOverrides); const b = (blockSuffix = "") => _bem(namespace.value, block, blockSuffix, "", ""); const e = (element) => element ? _bem(namespace.value, block, "", element, "") : ""; const m = (modifier) => modifier ? _bem(namespace.value, block, "", "", modifier) : ""; const be = (blockSuffix, element) => blockSuffix && element ? _bem(namespace.value, block, blockSuffix, element, "") : ""; const em = (element, modifier) => element && modifier ? _bem(namespace.value, block, "", element, modifier) : ""; const bm = (blockSuffix, modifier) => blockSuffix && modifier ? _bem(namespace.value, block, blockSuffix, "", modifier) : ""; const bem = (blockSuffix, element, modifier) => blockSuffix && element && modifier ? _bem(namespace.value, block, blockSuffix, element, modifier) : ""; const is = (name, ...args) => { const state = args.length >= 1 ? args[0] : true; return name && state ? `${statePrefix}${name}` : ""; }; const cssVar = (object) => { const styles = {}; for (const key in object) { if (object[key]) { styles[`--${namespace.value}-${key}`] = object[key]; } } return styles; }; const cssVarBlock = (object) => { const styles = {}; for (const key in object) { if (object[key]) { styles[`--${namespace.value}-${block}-${key}`] = object[key]; } } return styles; }; const cssVarName = (name) => `--${namespace.value}-${name}`; const cssVarBlockName = (name) => `--${namespace.value}-${block}-${name}`; return { namespace, b, e, m, be, em, bm, bem, is, cssVar, cssVarName, cssVarBlock, cssVarBlockName }; }; const useLockscreen = (trigger, options = {}) => { if (!vue.isRef(trigger)) { throwError("[useLockscreen]", "You need to pass a ref param to this function"); } const ns = options.ns || useNamespace("popup"); const hiddenCls = computed(() => ns.bm("parent", "hidden")); if (!isClient || hasClass(document.body, hiddenCls.value)) { return; } let scrollBarWidth2 = 0; let withoutHiddenClass = false; let bodyWidth = "0"; const cleanup = () => { setTimeout(() => { removeClass(document == null ? void 0 : document.body, hiddenCls.value); if (withoutHiddenClass && document) { document.body.style.width = bodyWidth; } }, 200); }; vue.watch(trigger, (val) => { if (!val) { cleanup(); return; } withoutHiddenClass = !hasClass(document.body, hiddenCls.value); if (withoutHiddenClass) { bodyWidth = document.body.style.width; } scrollBarWidth2 = getScrollBarWidth(ns.namespace.value); const bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight; const bodyOverflowY = getStyle(document.body, "overflowY"); if (scrollBarWidth2 > 0 && (bodyHasOverflow || bodyOverflowY === "scroll") && withoutHiddenClass) { document.body.style.width = `calc(100% - ${scrollBarWidth2}px)`; } addClass(document.body, hiddenCls.value); }); vue.onScopeDispose(() => cleanup()); }; const useSameTarget = (handleClick) => { if (!handleClick) { return { onClick: NOOP, onMousedown: NOOP, onMouseup: NOOP }; } let mousedownTarget = false; let mouseupTarget = false; const onClick = (e) => { if (mousedownTarget && mouseupTarget) { handleClick(e); } mousedownTarget = mouseupTarget = false; }; const onMousedown = (e) => { mousedownTarget = e.target === e.currentTarget; }; const onMouseup = (e) => { mouseupTarget = e.target === e.currentTarget; }; return { onClick, onMousedown, onMouseup }; }; const defaultIdInjection = { prefix: Math.floor(Math.random() * 1e4), current: 0 }; const ID_INJECTION_KEY = Symbol("elIdInjection"); const useIdInjection = () => { return vue.getCurrentInstance() ? vue.inject(ID_INJECTION_KEY, defaultIdInjection) : defaultIdInjection; }; const useId = (deterministicId) => { const idInjection = useIdInjection(); const namespace = useGetDerivedNamespace(); const idRef = vue.computed(() => vue.unref(deterministicId) || `${namespace.value}-id-${idInjection.prefix}-${idInjection.current++}`); return idRef; }; let registeredEscapeHandlers = []; const cachedHandler = (e) => { const event = e; if (event.key === EVENT_CODE.esc) { registeredEscapeHandlers.forEach((registeredHandler) => registeredHandler(event)); } }; const useEscapeKeydown = (handler) => { vue.onMounted(() => { if (registeredEscapeHandlers.length === 0) { document.addEventListener("keydown", cachedHandler); } if (isClient) registeredEscapeHandlers.push(handler); }); vue.onBeforeUnmount(() => { registeredEscapeHandlers = registeredEscapeHandlers.filter((registeredHandler) => registeredHandler !== handler); if (registeredEscapeHandlers.length === 0) { if (isClient) document.removeEventListener("keydown", cachedHandler); } }); }; const initial = { current: 0 }; const zIndex = vue.ref(0); const defaultInitialZIndex = 2e3; const ZINDEX_INJECTION_KEY = Symbol("elZIndexContextKey"); const zIndexContextKey = Symbol("zIndexContextKey"); const useZIndex = (zIndexOverrides) => { const increasingInjection = vue.getCurrentInstance() ? vue.inject(ZINDEX_INJECTION_KEY, initial) : initial; const zIndexInjection = zIndexOverrides || (vue.getCurrentInstance() ? vue.inject(zIndexContextKey, void 0) : void 0); const initialZIndex = vue.computed(() => { const zIndexFromInjection = vue.unref(zIndexInjection); return isNumber(zIndexFromInjection) ? zIndexFromInjection : defaultInitialZIndex; }); const currentZIndex = vue.computed(() => initialZIndex.value + zIndex.value); const nextZIndex = () => { increasingInjection.current++; zIndex.value = increasingInjection.current; return currentZIndex.value; }; if (!isClient && !vue.inject(ZINDEX_INJECTION_KEY)) ; return { initialZIndex, currentZIndex, nextZIndex }; }; const configProviderContextKey = Symbol(); const globalConfig = vue.ref(); function useGlobalConfig(key, defaultValue = void 0) { const config = vue.getCurrentInstance() ? vue.inject(configProviderContextKey, globalConfig) : globalConfig; if (key) { return vue.computed(() => { var _a2, _b; return (_b = (_a2 = config.value) == null ? void 0 : _a2[key]) != null ? _b : defaultValue; }); } else { return config; } } var _export_sfc$1 = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const iconProps = buildProps({ size: { type: definePropType([Number, String]) }, color: { type: String } }); const __default__$2 = vue.defineComponent({ name: "ElIcon", inheritAttrs: false }); const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({ ...__default__$2, props: iconProps, setup(__props) { const props = __props; const ns = useNamespace("icon"); const style = vue.computed(() => { const { size, color } = props; if (!size && !color) return {}; return { fontSize: isUndefined(size) ? void 0 : addUnit(size), "--color": color }; }); return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock("i", vue.mergeProps({ class: vue.unref(ns).b(), style: vue.unref(style) }, _ctx.$attrs), [ vue.renderSlot(_ctx.$slots, "default") ], 16); }; } }); var Icon = /* @__PURE__ */ _export_sfc$1(_sfc_main$9, [["__file", "icon.vue"]]); const ElIcon = withInstall(Icon); const FOCUS_AFTER_TRAPPED = "focus-trap.focus-after-trapped"; const FOCUS_AFTER_RELEASED = "focus-trap.focus-after-released"; const FOCUSOUT_PREVENTED = "focus-trap.focusout-prevented"; const FOCUS_AFTER_TRAPPED_OPTS = { cancelable: true, bubbles: false }; const FOCUSOUT_PREVENTED_OPTS = { cancelable: true, bubbles: false }; const ON_TRAP_FOCUS_EVT = "focusAfterTrapped"; const ON_RELEASE_FOCUS_EVT = "focusAfterReleased"; const FOCUS_TRAP_INJECTION_KEY = Symbol("elFocusTrap"); const focusReason = vue.ref(); const lastUserFocusTimestamp = vue.ref(0); const lastAutomatedFocusTimestamp = vue.ref(0); let focusReasonUserCount = 0; const obtainAllFocusableElements = (element) => { const nodes = []; const walker = document.createTreeWalker(element, NodeFilter.SHOW_ELEMENT, { acceptNode: (node) => { const isHiddenInput = node.tagName === "INPUT" && node.type === "hidden"; if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP; return node.tabIndex >= 0 || node === document.activeElement ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); while (walker.nextNode()) nodes.push(walker.currentNode); return nodes; }; const getVisibleElement = (elements, container) => { for (const element of elements) { if (!isHidden(element, container)) return element; } }; const isHidden = (element, container) => { if (getComputedStyle(element).visibility === "hidden") return true; while (element) { if (container && element === container) return false; if (getComputedStyle(element).display === "none") return true; element = element.parentElement; } return false; }; const getEdges = (container) => { const focusable = obtainAllFocusableElements(container); const first = getVisibleElement(focusable, container); const last = getVisibleElement(focusable.reverse(), container); return [first, last]; }; const isSelectable = (element) => { return element instanceof HTMLInputElement && "select" in element; }; const tryFocus = (element, shouldSelect) => { if (element && element.focus) { const prevFocusedElement = document.activeElement; element.focus({ preventScroll: true }); lastAutomatedFocusTimestamp.value = window.performance.now(); if (element !== prevFocusedElement && isSelectable(element) && shouldSelect) { element.select(); } } }; function removeFromStack(list, item) { const copy = [...list]; const idx = list.indexOf(item); if (idx !== -1) { copy.splice(idx, 1); } return copy; } const createFocusableStack = () => { let stack = []; const push = (layer) => { const currentLayer = stack[0]; if (currentLayer && layer !== currentLayer) { currentLayer.pause(); } stack = removeFromStack(stack, layer); stack.unshift(layer); }; const remove = (layer) => { var _a2, _b; stack = removeFromStack(stack, layer); (_b = (_a2 = stack[0]) == null ? void 0 : _a2.resume) == null ? void 0 : _b.call(_a2); }; return { push, remove }; }; const focusFirstDescendant = (elements, shouldSelect = false) => { const prevFocusedElement = document.activeElement; for (const element of elements) { tryFocus(element, shouldSelect); if (document.activeElement !== prevFocusedElement) return; } }; const focusableStack = createFocusableStack(); const isFocusCausedByUserEvent = () => { return lastUserFocusTimestamp.value > lastAutomatedFocusTimestamp.value; }; const notifyFocusReasonPointer = () => { focusReason.value = "pointer"; lastUserFocusTimestamp.value = window.performance.now(); }; const notifyFocusReasonKeydown = () => { focusReason.value = "keyboard"; lastUserFocusTimestamp.value = window.performance.now(); }; const useFocusReason = () => { vue.onMounted(() => { if (focusReasonUserCount === 0) { document.addEventListener("mousedown", notifyFocusReasonPointer); document.addEventListener("touchstart", notifyFocusReasonPointer); document.addEventListener("keydown", notifyFocusReasonKeydown); } focusReasonUserCount++; }); vue.onBeforeUnmount(() => { focusReasonUserCount--; if (focusReasonUserCount <= 0) { document.removeEventListener("mousedown", notifyFocusReasonPointer); document.removeEventListener("touchstart", notifyFocusReasonPointer); document.removeEventListener("keydown", notifyFocusReasonKeydown); } }); return { focusReason, lastUserFocusTimestamp, lastAutomatedFocusTimestamp }; }; const createFocusOutPreventedEvent = (detail) => { return new CustomEvent(FOCUSOUT_PREVENTED, { ...FOCUSOUT_PREVENTED_OPTS, detail }); }; const _sfc_main$8 = vue.defineComponent({ name: "ElFocusTrap", inheritAttrs: false, props: { loop: Boolean, trapped: Boolean, focusTrapEl: Object, focusStartEl: { type: [Object, String], default: "first" } }, emits: [ ON_TRAP_FOCUS_EVT, ON_RELEASE_FOCUS_EVT, "focusin", "focusout", "focusout-prevented", "release-requested" ], setup(props, { emit }) { const forwardRef = vue.ref(); let lastFocusBeforeTrapped; let lastFocusAfterTrapped; const { focusReason: focusReason2 } = useFocusReason(); useEscapeKeydown((event) => { if (props.trapped && !focusLayer.paused) { emit("release-requested", event); } }); const focusLayer = { paused: false, pause() { this.paused = true; }, resume() { this.paused = false; } }; const onKeydown = (e) => { if (!props.loop && !props.trapped) return; if (focusLayer.paused) return; const { key, altKey, ctrlKey, metaKey, currentTarget, shiftKey } = e; const { loop } = props; const isTabbing = key === EVENT_CODE.tab && !altKey && !ctrlKey && !metaKey; const currentFocusingEl = document.activeElement; if (isTabbing && currentFocusingEl) { const container = currentTarget; const [first, last] = getEdges(container); const isTabbable = first && last; if (!isTabbable) { if (currentFocusingEl === container) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason2.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { e.preventDefault(); } } } else { if (!shiftKey && currentFocusingEl === last) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason2.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { e.preventDefault(); if (loop) tryFocus(first, true); } } else if (shiftKey && [first, container].includes(currentFocusingEl)) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason2.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { e.preventDefault(); if (loop) tryFocus(last, true); } } } } }; vue.provide(FOCUS_TRAP_INJECTION_KEY, { focusTrapRef: forwardRef, onKeydown }); vue.watch(() => props.focusTrapEl, (focusTrapEl) => { if (focusTrapEl) { forwardRef.value = focusTrapEl; } }, { immediate: true }); vue.watch([forwardRef], ([forwardRef2], [oldForwardRef]) => { if (forwardRef2) { forwardRef2.addEventListener("keydown", onKeydown); forwardRef2.addEventListener("focusin", onFocusIn); forwardRef2.addEventListener("focusout", onFocusOut); } if (oldForwardRef) { oldForwardRef.removeEventListener("keydown", onKeydown); oldForwardRef.removeEventListener("focusin", onFocusIn); oldForwardRef.removeEventListener("focusout", onFocusOut); } }); const trapOnFocus = (e) => { emit(ON_TRAP_FOCUS_EVT, e); }; const releaseOnFocus = (e) => emit(ON_RELEASE_FOCUS_EVT, e); const onFocusIn = (e) => { const trapContainer = vue.unref(forwardRef); if (!trapContainer) return; const target = e.target; const relatedTarget = e.relatedTarget; const isFocusedInTrap = target && trapContainer.contains(target); if (!props.trapped) { const isPrevFocusedInTrap = relatedTarget && trapContainer.contains(relatedTarget); if (!isPrevFocusedInTrap) { lastFocusBeforeTrapped = relatedTarget; } } if (isFocusedInTrap) emit("focusin", e); if (focusLayer.paused) return; if (props.trapped) { if (isFocusedInTrap) { lastFocusAfterTrapped = target; } else { tryFocus(lastFocusAfterTrapped, true); } } }; const onFocusOut = (e) => { const trapContainer = vue.unref(forwardRef); if (focusLayer.paused || !trapContainer) return; if (props.trapped) { const relatedTarget = e.relatedTarget; if (!isNil(relatedTarget) && !trapContainer.contains(relatedTarget)) { setTimeout(() => { if (!focusLayer.paused && props.trapped) { const focusoutPreventedEvent = createFocusOutPreventedEvent({ focusReason: focusReason2.value }); emit("focusout-prevented", focusoutPreventedEvent); if (!focusoutPreventedEvent.defaultPrevented) { tryFocus(lastFocusAfterTrapped, true); } } }, 0); } } else { const target = e.target; const isFocusedInTrap = target && trapContainer.contains(target); if (!isFocusedInTrap) emit("focusout", e); } }; async function startTrap() { await vue.nextTick(); const trapContainer = vue.unref(forwardRef); if (trapContainer) { focusableStack.push(focusLayer); const prevFocusedElement = trapContainer.contains(document.activeElement) ? lastFocusBeforeTrapped : document.activeElement; lastFocusBeforeTrapped = prevFocusedElement; const isPrevFocusContained = trapContainer.contains(prevFocusedElement); if (!isPrevFocusContained) { const focusEvent = new Event(FOCUS_AFTER_TRAPPED, FOCUS_AFTER_TRAPPED_OPTS); trapContainer.addEventListener(FOCUS_AFTER_TRAPPED, trapOnFocus); trapContainer.dispatchEvent(focusEvent); if (!focusEvent.defaultPrevented) { vue.nextTick(() => { let focusStartEl = props.focusStartEl; if (!isString(focusStartEl)) { tryFocus(focusStartEl); if (document.activeElement !== focusStartEl) { focusStartEl = "first"; } } if (focusStartEl === "first") { focusFirstDescendant(obtainAllFocusableElements(trapContainer), true); } if (document.activeElement === prevFocusedElement || focusStartEl === "container") { tryFocus(trapContainer); } }); } } } } function stopTrap() { const trapContainer = vue.unref(forwardRef); if (trapContainer) { trapContainer.removeEventListener(FOCUS_AFTER_TRAPPED, trapOnFocus); const releasedEvent = new CustomEvent(FOCUS_AFTER_RELEASED, { ...FOCUS_AFTER_TRAPPED_OPTS, detail: { focusReason: focusReason2.value } }); trapContainer.addEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus); trapContainer.dispatchEvent(releasedEvent); if (!releasedEvent.defaultPrevented && (focusReason2.value == "keyboard" || !isFocusCausedByUserEvent() || trapContainer.contains(document.activeElement))) { tryFocus(lastFocusBeforeTrapped != null ? lastFocusBeforeTrapped : document.body); } trapContainer.removeEventListener(FOCUS_AFTER_RELEASED, releaseOnFocus); focusableStack.remove(focusLayer); } } vue.onMounted(() => { if (props.trapped) { startTrap(); } vue.watch(() => props.trapped, (trapped) => { if (trapped) { startTrap(); } else { stopTrap(); } }); }); vue.onBeforeUnmount(() => { if (props.trapped) { stopTrap(); } }); return { onKeydown }; } }); function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return vue.renderSlot(_ctx.$slots, "default", { handleKeydown: _ctx.onKeydown }); } var ElFocusTrap = /* @__PURE__ */ _export_sfc$1(_sfc_main$8, [["render", _sfc_render], ["__file", "focus-trap.vue"]]); const overlayProps = buildProps({ mask: { type: Boolean, default: true }, customMaskEvent: { type: Boolean, default: false }, overlayClass: { type: definePropType([ String, Array, Object ]) }, zIndex: { type: definePropType([String, Number]) } }); const overlayEmits = { click: (evt) => evt instanceof MouseEvent }; const BLOCK = "overlay"; var Overlay = vue.defineComponent({ name: "ElOverlay", props: overlayProps, emits: overlayEmits, setup(props, { slots, emit }) { const ns = useNamespace(BLOCK); const onMaskClick = (e) => { emit("click", e); }; const { onClick, onMousedown, onMouseup } = useSameTarget(props.customMaskEvent ? void 0 : onMaskClick); return () => { return props.mask ? vue.createVNode("div", { class: [ns.b(), props.overlayClass], style: { zIndex: props.zIndex }, onClick, onMousedown, onMouseup }, [vue.renderSlot(slots, "default")], PatchFlags.STYLE | PatchFlags.CLASS | PatchFlags.PROPS, ["onClick", "onMouseup", "onMousedown"]) : vue.h("div", { class: props.overlayClass, style: { zIndex: props.zIndex, position: "fixed", top: "0px", right: "0px", bottom: "0px", left: "0px" } }, [vue.renderSlot(slots, "default")]); }; } }); const ElOverlay = Overlay; const dialogInjectionKey = Symbol("dialogInjectionKey"); const dialogContentProps = buildProps({ center: Boolean, alignCenter: Boolean, closeIcon: { type: iconPropType }, draggable: Boolean, overflow: Boolean, fullscreen: Boolean, showClose: { type: Boolean, default: true }, title: { type: String, default: "" }, ariaLevel: { type: String, default: "2" } }); const dialogContentEmits = { close: () => true }; const _hoisted_1$6 = ["aria-level"]; const _hoisted_2$3 = ["aria-label"]; const _hoisted_3$3 = ["id"]; const __default__$1 = vue.defineComponent({ name: "ElDialogContent" }); const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({ ...__default__$1, props: dialogContentProps, emits: dialogContentEmits, setup(__props) { const props = __props; const { t } = useLocale(); const { Close } = CloseComponents; const { dialogRef, headerRef, bodyId, ns, style } = vue.inject(dialogInjectionKey); const { focusTrapRef } = vue.inject(FOCUS_TRAP_INJECTION_KEY); const dialogKls = vue.computed(() => [ ns.b(), ns.is("fullscreen", props.fullscreen), ns.is("draggable", props.draggable), ns.is("align-center", props.alignCenter), { [ns.m("center")]: props.center } ]); const composedDialogRef = composeRefs(focusTrapRef, dialogRef); const draggable = vue.computed(() => props.draggable); const overflow = vue.computed(() => props.overflow); useDraggable(dialogRef, headerRef, draggable, overflow); return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock("div", { ref: vue.unref(composedDialogRef), class: vue.normalizeClass(vue.unref(dialogKls)), style: vue.normalizeStyle(vue.unref(style)), tabindex: "-1" }, [ vue.createElementVNode("header", { ref_key: "headerRef", ref: headerRef, class: vue.normalizeClass([vue.unref(ns).e("header"), { "show-close": _ctx.showClose }]) }, [ vue.renderSlot(_ctx.$slots, "header", {}, () => [ vue.createElementVNode("span", { role: "heading", "aria-level": _ctx.ariaLevel, class: vue.normalizeClass(vue.unref(ns).e("title")) }, vue.toDisplayString(_ctx.title), 11, _hoisted_1$6) ]), _ctx.showClose ? (vue.openBlock(), vue.createElementBlock("button", { key: 0, "aria-label": vue.unref(t)("el.dialog.close"), class: vue.normalizeClass(vue.unref(ns).e("headerbtn")), type: "button", onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("close")) }, [ vue.createVNode(vue.unref(ElIcon), { class: vue.normalizeClass(vue.unref(ns).e("close")) }, { default: vue.withCtx(() => [ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.closeIcon || vue.unref(Close)))) ]), _: 1 }, 8, ["class"]) ], 10, _hoisted_2$3)) : vue.createCommentVNode("v-if", true) ], 2), vue.createElementVNode("div", { id: vue.unref(bodyId), class: vue.normalizeClass(vue.unref(ns).e("body")) }, [ vue.renderSlot(_ctx.$slots, "default") ], 10, _hoisted_3$3), _ctx.$slots.footer ? (vue.openBlock(), vue.createElementBlock("footer", { key: 0, class: vue.normalizeClass(vue.unref(ns).e("footer")) }, [ vue.renderSlot(_ctx.$slots, "footer") ], 2)) : vue.createCommentVNode("v-if", true) ], 6); }; } }); var ElDialogContent = /* @__PURE__ */ _export_sfc$1(_sfc_main$7, [["__file", "dialog-content.vue"]]); const dialogProps = buildProps({ ...dialogContentProps, appendToBody: Boolean, appendTo: { type: definePropType(String), default: "body" }, beforeClose: { type: definePropType(Function) }, destroyOnClose: Boolean, closeOnClickModal: { type: Boolean, default: true }, closeOnPressEscape: { type: Boolean, default: true }, lockScroll: { type: Boolean, default: true }, modal: { type: Boolean, default: true }, openDelay: { type: Number, default: 0 }, closeDelay: { type: Number, default: 0 }, top: { type: String }, modelValue: Boolean, modalClass: String, width: { type: [String, Number] }, zIndex: { type: Number }, trapFocus: { type: Boolean, default: false }, headerAriaLevel: { type: String, default: "2" } }); const dialogEmits = { open: () => true, opened: () => true, close: () => true, closed: () => true, [UPDATE_MODEL_EVENT]: (value) => isBoolean(value), openAutoFocus: () => true, closeAutoFocus: () => true }; const useDialog = (props, targetRef) => { var _a2; const instance = vue.getCurrentInstance(); const emit = instance.emit; const { nextZIndex } = useZIndex(); let lastPosition = ""; const titleId = useId(); const bodyId = useId(); const visible = vue.ref(false); const closed = vue.ref(false); const rendered = vue.ref(false); const zIndex2 = vue.ref((_a2 = props.zIndex) != null ? _a2 : nextZIndex()); let openTimer = void 0; let closeTimer = void 0; const namespace = useGlobalConfig("namespace", defaultNamespace); const style = vue.computed(() => { const style2 = {}; const varPrefix = `--${namespace.value}-dialog`; if (!props.fullscreen) { if (props.top) { style2[`${varPrefix}-margin-top`] = props.top; } if (props.width) { style2[`${varPrefix}-width`] = addUnit(props.width); } } return style2; }); const overlayDialogStyle = vue.computed(() => { if (props.alignCenter) { return { display: "flex" }; } return {}; }); function afterEnter() { emit("opened"); } function afterLeave() { emit("closed"); emit(UPDATE_MODEL_EVENT, false); if (props.destroyOnClose) { rendered.value = false; } } function beforeLeave() { emit("close"); } function open() { closeTimer == null ? void 0 : closeTimer(); openTimer == null ? void 0 : openTimer(); if (props.openDelay && props.openDelay > 0) { ({ stop: openTimer } = useTimeoutFn(() => doOpen(), props.openDelay)); } else { doOpen(); } } function close() { openTimer == null ? void 0 : openTimer(); closeTimer == null ? void 0 : closeTimer(); if (props.closeDelay && props.closeDelay > 0) { ({ stop: closeTimer } = useTimeoutFn(() => doClose(), props.closeDelay)); } else { doClose(); } } function handleClose() { function hide(shouldCancel) { if (shouldCancel) return; closed.value = true; visible.value = false; } if (props.beforeClose) { props.beforeClose(hide); } else { close(); } } function onModalClick() { if (props.closeOnClickModal) { handleClose(); } } function doOpen() { if (!isClient) return; visible.value = true; } function doClose() { visible.value = false; } function onOpenAutoFocus() { emit("openAutoFocus"); } function onCloseAutoFocus() { emit("closeAutoFocus"); } function onFocusoutPrevented(event) { var _a22; if (((_a22 = event.detail) == null ? void 0 : _a22.focusReason) === "pointer") { event.preventDefault(); } } if (props.lockScroll) { useLockscreen(visible); } function onCloseRequested() { if (props.closeOnPressEscape) { handleClose(); } } vue.watch(() => props.modelValue, (val) => { if (val) { closed.value = false; open(); rendered.value = true; zIndex2.value = isUndefined$1(props.zIndex) ? nextZIndex() : zIndex2.value++; vue.nextTick(() => { emit("open"); if (targetRef.value) { targetRef.value.scrollTop = 0; } }); } else { if (visible.value) { close(); } } }); vue.watch(() => props.fullscreen, (val) => { if (!targetRef.value) return; if (val) { lastPosition = targetRef.value.style.transform; targetRef.value.style.transform = ""; } else { targetRef.value.style.transform = lastPosition; } }); vue.onMounted(() => { if (props.modelValue) { visible.value = true; rendered.value = true; open(); } }); return { afterEnter, afterLeave, beforeLeave, handleClose, onModalClick, close, doClose, onOpenAutoFocus, onCloseAutoFocus, onCloseRequested, onFocusoutPrevented, titleId, bodyId, closed, style, overlayDialogStyle, rendered, visible, zIndex: zIndex2 }; }; const _hoisted_1$5 = ["aria-label", "aria-labelledby", "aria-describedby"]; const __default__ = vue.defineComponent({ name: "ElDialog", inheritAttrs: false }); const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({ ...__default__, props: dialogProps, emits: dialogEmits, setup(__props, { expose }) { const props = __props; const slots = vue.useSlots(); useDeprecated({ scope: "el-dialog", from: "the title slot", replacement: "the header slot", version: "3.0.0", ref: "https://element-plus.org/en-US/component/dialog.html#slots" }, vue.computed(() => !!slots.title)); const ns = useNamespace("dialog"); const dialogRef = vue.ref(); const headerRef = vue.ref(); const dialogContentRef = vue.ref(); const { visible, titleId, bodyId, style, overlayDialogStyle, rendered, zIndex: zIndex2, afterEnter, afterLeave, beforeLeave, handleClose, onModalClick, onOpenAutoFocus, onCloseAutoFocus, onCloseRequested, onFocusoutPrevented } = useDialog(props, dialogRef); vue.provide(dialogInjectionKey, { dialogRef, headerRef, bodyId, ns, rendered, style }); const overlayEvent = useSameTarget(onModalClick); const draggable = vue.computed(() => props.draggable && !props.fullscreen); expose({ visible, dialogContentRef }); return (_ctx, _cache) => { return vue.openBlock(), vue.createBlock(vue.Teleport, { to: _ctx.appendTo, disabled: _ctx.appendTo !== "body" ? false : !_ctx.appendToBody }, [ vue.createVNode(vue.Transition, { name: "dialog-fade", onAfterEnter: vue.unref(afterEnter), onAfterLeave: vue.unref(afterLeave), onBeforeLeave: vue.unref(beforeLeave), persisted: "" }, { default: vue.withCtx(() => [ vue.withDirectives(vue.createVNode(vue.unref(ElOverlay), { "custom-mask-event": "", mask: _ctx.modal, "overlay-class": _ctx.modalClass, "z-index": vue.unref(zIndex2) }, { default: vue.withCtx(() => [ vue.createElementVNode("div", { role: "dialog", "aria-modal": "true", "aria-label": _ctx.title || void 0, "aria-labelledby": !_ctx.title ? vue.unref(titleId) : void 0, "aria-describedby": vue.unref(bodyId), class: vue.normalizeClass(`${vue.unref(ns).namespace.value}-overlay-dialog`), style: vue.normalizeStyle(vue.unref(overlayDialogStyle)), onClick: _cache[0] || (_cache[0] = (...args) => vue.unref(overlayEvent).onClick && vue.unref(overlayEvent).onClick(...args)), onMousedown: _cache[1] || (_cache[1] = (...args) => vue.unref(overlayEvent).onMousedown && vue.unref(overlayEvent).onMousedown(...args)), onMouseup: _cache[2] || (_cache[2] = (...args) => vue.unref(overlayEvent).onMouseup && vue.unref(overlayEvent).onMouseup(...args)) }, [ vue.createVNode(vue.unref(ElFocusTrap), { loop: "", trapped: vue.unref(visible), "focus-start-el": "container", onFocusAfterTrapped: vue.unref(onOpenAutoFocus), onFocusAfterReleased: vue.unref(onCloseAutoFocus), onFocusoutPrevented: vue.unref(onFocusoutPrevented), onReleaseRequested: vue.unref(onCloseRequested) }, { default: vue.withCtx(() => [ vue.unref(rendered) ? (vue.openBlock(), vue.createBlock(ElDialogContent, vue.mergeProps({ key: 0, ref_key: "dialogContentRef", ref: dialogContentRef }, _ctx.$attrs, { center: _ctx.center, "align-center": _ctx.alignCenter, "close-icon": _ctx.closeIcon, draggable: vue.unref(draggable), overflow: _ctx.overflow, fullscreen: _ctx.fullscreen, "show-close": _ctx.showClose, title: _ctx.title, "aria-level": _ctx.headerAriaLevel, onClose: vue.unref(handleClose) }), vue.createSlots({ header: vue.withCtx(() => [ !_ctx.$slots.title ? vue.renderSlot(_ctx.$slots, "header", { key: 0, close: vue.unref(handleClose), titleId: vue.unref(titleId), titleClass: vue.unref(ns).e("title") }) : vue.renderSlot(_ctx.$slots, "title", { key: 1 }) ]), default: vue.withCtx(() => [ vue.renderSlot(_ctx.$slots, "default") ]), _: 2 }, [ _ctx.$slots.footer ? { name: "footer", fn: vue.withCtx(() => [ vue.renderSlot(_ctx.$slots, "footer") ]) } : void 0 ]), 1040, ["center", "align-center", "close-icon", "draggable", "overflow", "fullscreen", "show-close", "title", "aria-level", "onClose"])) : vue.createCommentVNode("v-if", true) ]), _: 3 }, 8, ["trapped", "onFocusAfterTrapped", "onFocusAfterReleased", "onFocusoutPrevented", "onReleaseRequested"]) ], 46, _hoisted_1$5) ]), _: 3 }, 8, ["mask", "overlay-class", "z-index"]), [ [vue.vShow, vue.unref(visible)] ]) ]), _: 3 }, 8, ["onAfterEnter", "onAfterLeave", "onBeforeLeave"]) ], 8, ["to", "disabled"]); }; } }); var Dialog = /* @__PURE__ */ _export_sfc$1(_sfc_main$6, [["__file", "dialog.vue"]]); const ElDialog = withInstall(Dialog); const SCOPE = "ElInfiniteScroll"; const CHECK_INTERVAL = 50; const DEFAULT_DELAY = 200; const DEFAULT_DISTANCE = 0; const attributes = { delay: { type: Number, default: DEFAULT_DELAY }, distance: { type: Number, default: DEFAULT_DISTANCE }, disabled: { type: Boolean, default: false }, immediate: { type: Boolean, default: true } }; const getScrollOptions = (el, instance) => { return Object.entries(attributes).reduce((acm, [name, option]) => { var _a2, _b; const { type, default: defaultValue } = option; const attrVal = el.getAttribute(`infinite-scroll-${name}`); let value = (_b = (_a2 = instance[attrVal]) != null ? _a2 : attrVal) != null ? _b : defaultValue; value = value === "false" ? false : value; value = type(value); acm[name] = Number.isNaN(value) ? defaultValue : value; return acm; }, {}); }; const destroyObserver = (el) => { const { observer } = el[SCOPE]; if (observer) { observer.disconnect(); delete el[SCOPE].observer; } }; const handleScroll = (el, cb) => { const { container, containerEl, instance, observer, lastScrollTop } = el[SCOPE]; const { disabled, distance } = getScrollOptions(el, instance); const { clientHeight, scrollHeight, scrollTop } = containerEl; const delta = scrollTop - lastScrollTop; el[SCOPE].lastScrollTop = scrollTop; if (observer || disabled || delta < 0) return; let shouldTrigger = false; if (container === el) { shouldTrigger = scrollHeight - (clientHeight + scrollTop) <= distance; } else { const { clientTop, scrollHeight: height } = el; const offsetTop = getOffsetTopDistance(el, containerEl); shouldTrigger = scrollTop + clientHeight >= offsetTop + clientTop + height - distance; } if (shouldTrigger) { cb.call(instance); } }; function checkFull(el, cb) { const { containerEl, instance } = el[SCOPE]; const { disabled } = getScrollOptions(el, instance); if (disabled || containerEl.clientHeight === 0) return; if (containerEl.scrollHeight <= containerEl.clientHeight) { cb.call(instance); } else { destroyObserver(el); } } const InfiniteScroll = { async mounted(el, binding) { const { instance, value: cb } = binding; if (!isFunction$1(cb)) { throwError(SCOPE, "'v-infinite-scroll' binding value must be a function"); } await vue.nextTick(); const { delay, immediate } = getScrollOptions(el, instance); const container = getScrollContainer(el, true); const containerEl = container === window ? document.documentElement : container; const onScroll = throttle(handleScroll.bind(null, el, cb), delay); if (!container) return; el[SCOPE] = { instance, container, containerEl, delay, cb, onScroll, lastScrollTop: containerEl.scrollTop }; if (immediate) { const observer = new MutationObserver(throttle(checkFull.bind(null, el, cb), CHECK_INTERVAL)); el[SCOPE].observer = observer; observer.observe(el, { childList: true, subtree: true }); checkFull(el, cb); } container.addEventListener("scroll", onScroll); }, unmounted(el) { const { container, onScroll } = el[SCOPE]; container == null ? void 0 : container.removeEventListener("scroll", onScroll); destroyObserver(el); }, async updated(el) { if (!el[SCOPE]) { await vue.nextTick(); } else { const { containerEl, cb, observer } = el[SCOPE]; if (containerEl.clientHeight && observer) { checkFull(el, cb); } } } }; const _InfiniteScroll = InfiniteScroll; _InfiniteScroll.install = (app) => { app.directive("InfiniteScroll", _InfiniteScroll); }; const ElInfiniteScroll = _InfiniteScroll; const useModalStore = defineStore("modal", () => { const modalDialogVisible = vue.ref(false); const modalTitle = vue.ref(""); return { modalDialogVisible, modalTitle }; }); var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)(); const _export_sfc = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const _hoisted_1$4 = ["infinite-scroll-disabled"]; const _hoisted_2$2 = ["innerHTML"]; const _hoisted_3$2 = { key: 0 }; const _hoisted_4$2 = ["infinite-scroll-disabled"]; const _hoisted_5$2 = ["innerHTML"]; const _hoisted_6$1 = { key: 0 }; const _hoisted_7$1 = ["infinite-scroll-disabled"]; const _hoisted_8$1 = ["innerHTML"]; const _hoisted_9 = { key: 0 }; const _hoisted_10 = ["infinite-scroll-disabled"]; const _hoisted_11 = ["innerHTML"]; const _hoisted_12 = { key: 0 }; const _sfc_main$5 = { __name: "ModalDialog", setup(__props) { const modalStore = useModalStore(); const { modalDialogVisible, modalTitle } = storeToRefs(modalStore); const watchLaterNodes = vue.ref([]); const watchLaterFanHaoList = vue.ref(_GM_getValue("watch_later")); const watchLaterPageNum = vue.ref(0); const watchLaterNoMore = vue.ref(false); const starNodes = vue.ref([]); const starFanHaoList = vue.ref(_GM_getValue("star").toReversed()); const starPageNum = vue.ref(0); const starNoMore = vue.ref(false); const watchedNodes = vue.ref([]); const watchedFanHaoList = vue.ref(_GM_getValue("watched").toReversed()); const watchedPageNum = vue.ref(0); const watchedNoMore = vue.ref(false); const actressNodes = vue.ref([]); const actressFanHaoList = vue.ref(_GM_getValue("actress").toReversed()); const actressPageNum = vue.ref(0); const actressNoMore = vue.ref(false); const stepSize = vue.ref(20); const watchLaterMaxPage = vue.computed(() => { return Math.ceil(watchLaterFanHaoList.value.length / stepSize.value); }); const starMaxPage = vue.computed(() => { return Math.ceil(starFanHaoList.value.length / stepSize.value); }); const watchedMaxPage = vue.computed(() => { return Math.ceil(watchedFanHaoList.value.length / stepSize.value); }); const actressMaxPage = vue.computed(() => { return Math.ceil(actressFanHaoList.value.length / stepSize.value); }); async function loadWatchLater() { if (watchLaterPageNum.value <= watchLaterMaxPage.value) { watchLaterPageNum.value++; console.log(watchLaterPageNum.value); const fanHaoList = stepArray(watchLaterFanHaoList.value, stepSize.value, watchLaterPageNum.value).map((item) => item); const nodes = await fetchData(fanHaoList); if (nodes.length === 0) { watchLaterNoMore.value = true; } watchLaterNodes.value.push(...nodes); } } async function loadStar() { if (starPageNum.value <= starMaxPage.value) { starPageNum.value++; const fanHaoList = stepArray(starFanHaoList.value, stepSize.value, starPageNum.value).map((item) => item); const nodes = await fetchData(fanHaoList); if (nodes.length === 0) { starNoMore.value = true; } starNodes.value.push(...nodes); } } async function loadWatched() { if (watchedPageNum.value <= watchedMaxPage.value) { watchedPageNum.value++; const fanHaoList = stepArray(watchedFanHaoList.value, stepSize.value, watchedPageNum.value).map((item) => item); const nodes = await fetchData(fanHaoList); if (nodes.length === 0) { watchedNoMore.value = true; } watchedNodes.value.push(...nodes); } } async function loadActress() { if (actressPageNum.value <= actressMaxPage.value) { actressPageNum.value++; const fanHaoList = stepArray(actressFanHaoList.value, stepSize.value, actressPageNum.value).map((item) => item); const nodes = await fetchData(fanHaoList); if (nodes.length === 0) { actressNoMore.value = true; } actressNodes.value.push(...nodes); } } function stepArray(arr, stepSize2, stepRound) { let startIndex = stepRound * stepSize2 - stepSize2; let endIndex = stepRound * stepSize2; return arr.slice(startIndex, endIndex); } async function fetchData(fanHaoList) { const result = await Promise.allSettled(fanHaoList.map((item) => { let keyword = ""; modalTitle.value === "喜欢的女优" ? keyword = "star" : keyword = "search"; const url = `/${keyword}/${item}`; return fetch(url); })); let nodes = []; for (const item of result) { if (item.status !== "fulfilled") { console.error(item.status); } else { const html = await item.value.text(); const domparser = new DOMParser(); let doc = domparser.parseFromString(html, "text/html"); let selector; modalTitle.value === "喜欢的女优" ? selector = ".avatar-box" : selector = ".movie-box"; if (doc.querySelector(selector) && doc.querySelector(selector).parentNode && doc.querySelector(selector).parentNode.cloneNode) { const node = doc.querySelector(selector).cloneNode(true); node.setAttribute("style", "margin:8px;"); node.setAttribute("target", "_blank"); if (modalTitle.value === "喜欢的女优" && doc.querySelector("body > nav > div > div.navbar-header.mh50 > div:nth-child(3) > ul > li:nth-child(4) > a")) { const url = doc.querySelector("body > nav > div > div.navbar-header.mh50 > div:nth-child(3) > ul > li:nth-child(4) > a").getAttribute("href"); const pathname = new URL(url).pathname; nodes.push(`<a href="${pathname}" target="_blank">${node.outerHTML}</a>`); } else { nodes.push(node.outerHTML); } } } } return nodes; } return (_ctx, _cache) => { const _component_el_dialog = ElDialog; const _directive_infinite_scroll = ElInfiniteScroll; return vue.openBlock(), vue.createBlock(_component_el_dialog, { modelValue: vue.unref(modalDialogVisible), "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.isRef(modalDialogVisible) ? modalDialogVisible.value = $event : null), title: vue.unref(modalTitle), fullscreen: true, center: "" }, { default: vue.withCtx(() => [ vue.unref(modalTitle) === "稍后观看" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { key: 0, "infinite-scroll-disabled": watchLaterNoMore.value, class: "infinite-list" }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(watchLaterNodes.value, (node, index) => { return vue.openBlock(), vue.createElementBlock("div", { key: index }, [ vue.createElementVNode("div", { innerHTML: node }, null, 8, _hoisted_2$2) ]); }), 128)), watchLaterNoMore.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$2, "没有更多了...")) : vue.createCommentVNode("", true) ], 8, _hoisted_1$4)), [ [_directive_infinite_scroll, loadWatchLater] ]) : vue.unref(modalTitle) === "已观看的影片" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { key: 1, "infinite-scroll-disabled": watchedNoMore.value, class: "infinite-list" }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(watchedNodes.value, (node, index) => { return vue.openBlock(), vue.createElementBlock("div", { key: index }, [ vue.createElementVNode("div", { innerHTML: node }, null, 8, _hoisted_5$2) ]); }), 128)), watchedNoMore.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$1, "没有更多了...")) : vue.createCommentVNode("", true) ], 8, _hoisted_4$2)), [ [_directive_infinite_scroll, loadWatched] ]) : vue.unref(modalTitle) === "喜欢的影片" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { key: 2, "infinite-scroll-disabled": starNoMore.value, class: "infinite-list" }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(starNodes.value, (node, index) => { return vue.openBlock(), vue.createElementBlock("div", { key: index }, [ vue.createElementVNode("div", { innerHTML: node }, null, 8, _hoisted_8$1) ]); }), 128)), starNoMore.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_9, "没有更多了...")) : vue.createCommentVNode("", true) ], 8, _hoisted_7$1)), [ [_directive_infinite_scroll, loadStar] ]) : vue.unref(modalTitle) === "喜欢的女优" ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", { key: 3, "infinite-scroll-disabled": actressNoMore.value, class: "infinite-list" }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(actressNodes.value, (node, index) => { return vue.openBlock(), vue.createElementBlock("div", { key: index }, [ vue.createElementVNode("div", { innerHTML: node }, null, 8, _hoisted_11) ]); }), 128)), actressNoMore.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12, "没有更多了...")) : vue.createCommentVNode("", true) ], 8, _hoisted_10)), [ [_directive_infinite_scroll, loadActress] ]) : vue.createCommentVNode("", true) ]), _: 1 }, 8, ["modelValue", "title"]); }; } }; const __unplugin_components_4 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-5dbc0225"]]); const _withScopeId$1 = (n) => (vue.pushScopeId("data-v-f6013da5"), n = n(), vue.popScopeId(), n); const _hoisted_1$3 = /* @__PURE__ */ _withScopeId$1(() => /* @__PURE__ */ vue.createElementVNode("div", { id: "div-container" }, [ /* @__PURE__ */ vue.createElementVNode("div", { class: "like-actress" }) ], -1)); const _sfc_main$4 = { __name: "Actress", setup(__props) { return (_ctx, _cache) => { return vue.openBlock(), vue.createBlock(vue.Teleport, { to: ".avatar-box > .photo-frame" }, [ _hoisted_1$3 ]); }; } }; const __unplugin_components_3 = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-f6013da5"]]); const _withScopeId = (n) => (vue.pushScopeId("data-v-60269620"), n = n(), vue.popScopeId(), n); const _hoisted_1$2 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("div", { id: "div-container" }, [ /* @__PURE__ */ vue.createElementVNode("div", { class: "star" }), /* @__PURE__ */ vue.createElementVNode("div", { class: "watchlater" }, [ /* @__PURE__ */ vue.createElementVNode("div", { class: "watchlater_tip", style: { "display": "none" } }) ]), /* @__PURE__ */ vue.createElementVNode("div", { class: "add_watched" }) ], -1)); const _sfc_main$3 = { __name: "SingleMoviePage", setup(__props) { return (_ctx, _cache) => { return vue.openBlock(), vue.createBlock(vue.Teleport, { to: ".bigImage" }, [ _hoisted_1$2 ]); }; } }; const __unplugin_components_2 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-60269620"]]); const _hoisted_1$1 = ["id"]; const _hoisted_2$1 = ["id"]; const _hoisted_3$1 = ["id"]; const _hoisted_4$1 = ["id"]; const _hoisted_5$1 = ["id"]; const _sfc_main$2 = { __name: "MoiveBoxes", setup(__props) { const movieBoxes = document.querySelectorAll(".movie-box"); return (_ctx, _cache) => { return vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(movieBoxes), (element, index) => { return vue.openBlock(), vue.createBlock(vue.Teleport, { to: element }, [ vue.createElementVNode("div", { id: `javbus-icon-star-${index + 1}`, class: "star" }, null, 8, _hoisted_1$1), vue.createElementVNode("div", { id: `javbus-icon-watched-${index + 1}`, class: "watched" }, "已观看", 8, _hoisted_2$1), vue.createElementVNode("div", { id: `javbus-icon-watch-later-${index + 1}`, class: "watchlater" }, [ vue.createElementVNode("div", { id: `javbus-icon-watch-later-tip-${index + 1}`, class: "watchlater_tip" }, null, 8, _hoisted_4$1) ], 8, _hoisted_3$1), vue.createElementVNode("div", { id: `javbus-icon-add-watched-${index + 1}`, class: "add_watched" }, "添加已观看", 8, _hoisted_5$1) ], 8, ["to"]); }), 256); }; } }; const __unplugin_components_1 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-5cbfd23f"]]); const _hoisted_1 = /* @__PURE__ */ vue.createElementVNode("b", null, "稍后观看", -1); const _hoisted_2 = [ _hoisted_1 ]; const _hoisted_3 = /* @__PURE__ */ vue.createElementVNode("b", null, "已观看", -1); const _hoisted_4 = [ _hoisted_3 ]; const _hoisted_5 = /* @__PURE__ */ vue.createElementVNode("b", null, "喜欢的影片", -1); const _hoisted_6 = [ _hoisted_5 ]; const _hoisted_7 = /* @__PURE__ */ vue.createElementVNode("b", null, "喜欢的女优", -1); const _hoisted_8 = [ _hoisted_7 ]; const _sfc_main$1 = { __name: "MenuBar", setup(__props) { const modalStore = useModalStore(); const { modalDialogVisible, modalTitle } = storeToRefs(modalStore); return (_ctx, _cache) => { return vue.openBlock(), vue.createBlock(vue.Teleport, { to: "#navbar > ul:nth-child(2)" }, [ vue.createElementVNode("li", null, [ vue.createElementVNode("a", { href: "#", id: "javbus-btn-watch-later", onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => { modalTitle.value = "稍后观看"; modalDialogVisible.value = true; }, ["stop", "prevent"])) }, _hoisted_2) ]), vue.createElementVNode("li", null, [ vue.createElementVNode("a", { href: "#", id: "javbus-btn-jav-watched", onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => { modalTitle.value = "已观看的影片"; modalDialogVisible.value = true; }, ["stop", "prevent"])) }, _hoisted_4) ]), vue.createElementVNode("li", null, [ vue.createElementVNode("a", { href: "#", id: "javbus-btn-jav-stared", onClick: _cache[2] || (_cache[2] = vue.withModifiers(($event) => { modalTitle.value = "喜欢的影片"; modalDialogVisible.value = true; }, ["stop", "prevent"])) }, _hoisted_6) ]), vue.createElementVNode("li", null, [ vue.createElementVNode("a", { href: "#", id: "javbus-btn-jav-liked-actress", onClick: _cache[3] || (_cache[3] = vue.withModifiers(($event) => { modalTitle.value = "喜欢的女优"; modalDialogVisible.value = true; }, ["stop", "prevent"])) }, _hoisted_8) ]) ]); }; } }; const _sfc_main = { __name: "App", setup(__props) { const showOnIndexPage = /\/#?$/.test(location.href) || /page|genre|search|star|studio|series|label|director|uncensored/.test(location.href); const showOnSingleMoviePage = /\/\w+\-\d+#?$/.test(location.href); const showOnActressPage = /[^search]star/.test(location.href); return (_ctx, _cache) => { const _component_MenuBar = _sfc_main$1; const _component_MoiveBoxes = __unplugin_components_1; const _component_SingleMoviePage = __unplugin_components_2; const _component_Actress = __unplugin_components_3; const _component_ModalDialog = __unplugin_components_4; return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [ vue.createVNode(_component_MenuBar), vue.unref(showOnIndexPage) ? (vue.openBlock(), vue.createBlock(_component_MoiveBoxes, { key: 0 })) : vue.createCommentVNode("", true), vue.unref(showOnSingleMoviePage) ? (vue.openBlock(), vue.createBlock(_component_SingleMoviePage, { key: 1 })) : vue.createCommentVNode("", true), vue.unref(showOnActressPage) ? (vue.openBlock(), vue.createBlock(_component_Actress, { key: 2 })) : vue.createCommentVNode("", true), vue.createVNode(_component_ModalDialog) ], 64); }; } }; const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3ba6e7bc"]]); function getFanhao(divMoviebox) { const fanhao = divMoviebox.getAttribute("href").split("/").at(-1); return fanhao; } function isWatched(fanhao) { if (_GM_getValue("watched")) { const result = _GM_getValue("watched").includes(fanhao); if (result) { console.log(`${fanhao} is watched.`); } return result; } return false; } function addWatched(fanhao) { let watched = _GM_getValue("watched"); watched.push(fanhao); watched = [...new Set(watched)]; _GM_setValue("watched", watched); console.log(`added ${fanhao} into watched.`); } function delWatched(fanhao) { let watched = _GM_getValue("watched"); watched = [...new Set(watched)]; const index = watched.indexOf(fanhao); if (index === -1) { return; } watched.splice(index, 1); _GM_setValue("watched", watched); console.log(`delete ${fanhao} from watched.`); } function isWatchlater(fanhao) { if (_GM_getValue("watch_later")) { const result = _GM_getValue("watch_later").includes(fanhao); if (result) { console.log(`${fanhao} is watch_later.`); } return result; } return false; } function addWatchlater(fanhao) { let watch_later = _GM_getValue("watch_later"); watch_later.push(fanhao); watch_later = [...new Set(watch_later)]; _GM_setValue("watch_later", watch_later); console.log(`added ${fanhao} into watch_later.`); } function delWatchlater(fanhao) { let watch_later = _GM_getValue("watch_later"); watch_later = [...new Set(watch_later)]; const index = watch_later.indexOf(fanhao); if (index === -1) { return; } watch_later.splice(index, 1); _GM_setValue("watch_later", watch_later); console.log(`delete ${fanhao} from watch_later.`); } function isStar(fanhao) { if (_GM_getValue("star")) { const result = _GM_getValue("star").includes(fanhao); if (result) { console.log(`${fanhao} is star.`); } return result; } return false; } function addStar(fanhao) { let star = _GM_getValue("star"); star.push(fanhao); star = [...new Set(star)]; _GM_setValue("star", star); console.log(`added ${fanhao} into star.`); } function delStar(fanhao) { let star = _GM_getValue("star"); star = [...new Set(star)]; const index = star.indexOf(fanhao); if (index === -1) { return; } star.splice(index, 1); _GM_setValue("star", star); console.log(`delete ${fanhao} from star.`); } function isLikeActress(id) { if (_GM_getValue("actress")) { const result = _GM_getValue("actress").includes(id); if (result) { console.log(`${id} is actress.`); } return result; } return false; } function addLikeActress(id) { let actress = _GM_getValue("actress"); actress.push(id); actress = [...new Set(actress)]; _GM_setValue("actress", actress); console.log(`added ${id} into actress.`); } function delLikeActress(id) { let actress = _GM_getValue("actress"); actress = [...new Set(actress)]; const index = actress.indexOf(id); if (index === -1) { return; } actress.splice(index, 1); _GM_setValue("actress", actress); console.log(`delete ${id} from actress.`); } function initLevelDB() { if (!_GM_getValue("watched")) { _GM_setValue("watched", []); } if (!_GM_getValue("watch_later")) { _GM_setValue("watch_later", []); } if (!_GM_getValue("star")) { _GM_setValue("star", []); } if (!_GM_getValue("actress")) { _GM_setValue("actress", []); } } function runInSinglePage() { const divWatchlater = document.querySelector("#div-container > div.watchlater"); const divAddWatched = document.querySelector("#div-container > div.add_watched"); const divStar = document.querySelector("#div-container > div.star"); document.querySelector("#div-container > div.watchlater > div"); divStar.addEventListener("click", function(event) { const divWatchlater2 = this.parentNode.querySelector(".watchlater"); const divAddWatched2 = this.parentNode.querySelector(".add_watched"); const fanhao2 = getFanhao2(); if (isStar(fanhao2)) { delStar(fanhao2); this.setAttribute("class", "star"); } else { addStar(fanhao2); this.setAttribute("class", "star active"); delWatchlater(fanhao2); divWatchlater2.setAttribute("class", "watchlater"); delWatched(fanhao2); divAddWatched2.setAttribute("class", "add_watched"); } event.stopPropagation(); event.preventDefault(); }); divAddWatched.addEventListener("click", function(event) { const divWatchlater2 = this.parentNode.querySelector(".watchlater"); const divStar2 = this.parentNode.querySelector(".star"); const fanhao2 = getFanhao2(); if (isWatched(fanhao2)) { delWatched(fanhao2); this.setAttribute("class", "add_watched"); } else { addWatched(fanhao2); this.setAttribute("class", "add_watched active"); delWatchlater(fanhao2); divWatchlater2.setAttribute("class", "watchlater"); delStar(fanhao2); divStar2.setAttribute("class", "star"); } event.stopPropagation(); event.preventDefault(); }); divWatchlater.addEventListener("mouseenter", function(event) { let div = this.querySelector(".watchlater_tip"); const fanhao2 = getFanhao2(); if (isWatchlater(fanhao2)) { div.textContent = "移除"; } else { div.textContent = "稍后再看"; } div.setAttribute("style", "display:block;"); console.log("out divWatchlater mouseenter"); }); divWatchlater.addEventListener("mouseleave", function(event) { let div = this.querySelector(".watchlater_tip"); div.setAttribute("style", "display:none;"); const fanhao2 = getFanhao2(); if (isWatchlater(fanhao2)) { this.setAttribute("class", "watchlater active"); } else { this.setAttribute("class", "watchlater"); } }); divWatchlater.addEventListener("click", function(event) { const divTip = this.querySelector(".watchlater_tip"); const divAddWatched2 = this.parentNode.querySelector(".add_watched"); const divStar2 = this.parentNode.querySelector(".star"); const fanhao2 = getFanhao2(); if (isWatchlater(fanhao2)) { delWatchlater(fanhao2); divTip.textContent = "已从稍后再看中移除"; this.setAttribute("class", "watchlater"); } else { divTip.textContent = "已添加至稍后再看"; this.setAttribute("class", "watchlater active"); addWatchlater(fanhao2); delWatched(fanhao2); divAddWatched2.setAttribute("class", "add_watched"); delStar(fanhao2); divStar2.setAttribute("class", "star"); } event.stopPropagation(); event.preventDefault(); }); function getFanhao2() { const span = document.querySelector("div.col-md-3.info > p:nth-child(1) > span:nth-child(2)"); const fanhao2 = span.textContent; return fanhao2; } const fanhao = getFanhao2(); if (isWatched(fanhao)) { divAddWatched.setAttribute("class", "add_watched active"); } else { divAddWatched.setAttribute("class", "add_watched"); } if (isWatchlater(fanhao)) { divWatchlater.setAttribute("class", "watchlater active"); } else { divWatchlater.setAttribute("class", "watchlater"); } if (isStar(fanhao)) { divStar.setAttribute("class", "star active"); } else { divStar.setAttribute("class", "star"); } } function runInListPage() { document.querySelectorAll(".movie-box").forEach((movieBox) => { movieBox.setAttribute("target", "_blank"); const divWatchlater = movieBox.querySelector(".watchlater"); movieBox.querySelector("watchlater_tip"); const divAddWatched = movieBox.querySelector(".add_watched"); movieBox.querySelector(".watched"); const divStar = movieBox.querySelector(".star"); divStar.addEventListener("click", function(event) { const divWatchlater2 = this.parentNode.querySelector(".watchlater"); const divAddWatched2 = this.parentNode.querySelector(".add_watched"); const fanhao2 = getFanhao(this.parentNode); if (isStar(fanhao2)) { delStar(fanhao2); this.setAttribute("class", "star"); } else { addStar(fanhao2); this.setAttribute("class", "star active"); delWatchlater(fanhao2); divWatchlater2.setAttribute("class", "watchlater"); delWatched(fanhao2); divAddWatched2.textContent = "添加已观看"; } event.preventDefault(); }); divAddWatched.addEventListener("click", function(event) { const divWatchlater2 = this.parentNode.querySelector(".watchlater"); const divStar2 = this.parentNode.querySelector(".star"); const fanhao2 = getFanhao(this.parentNode); if (isWatched(fanhao2)) { delWatched(fanhao2); this.textContent = "添加已观看"; } else { addWatched(fanhao2); this.textContent = "取消已观看"; delWatchlater(fanhao2); divWatchlater2.setAttribute("class", "watchlater"); delStar(fanhao2); divStar2.setAttribute("class", "star"); } event.preventDefault(); event.stopPropagation(); }); divWatchlater.addEventListener("mouseenter", function(event) { let div = this.querySelector(".watchlater_tip"); const fanhao2 = getFanhao(this.parentNode); if (isWatchlater(fanhao2)) { div.textContent = "移除"; } else { div.textContent = "稍后再看"; } div.setAttribute("style", "display:block;"); }); divWatchlater.addEventListener("mouseleave", function(event) { let div = this.querySelector(".watchlater_tip"); div.setAttribute("style", "display:none;"); const fanhao2 = getFanhao(this.parentNode); if (isWatchlater(fanhao2)) { this.setAttribute("class", "watchlater active"); } else { this.setAttribute("class", "watchlater"); } }); divWatchlater.addEventListener("click", function(event) { const divTip = this.querySelector(".watchlater_tip"); const divAddWatched2 = this.parentNode.querySelector(".add_watched"); const divStar2 = this.parentNode.querySelector(".star"); const fanhao2 = getFanhao(this.parentNode); if (isWatchlater(fanhao2)) { delWatchlater(fanhao2); divTip.textContent = "已从稍后再看中移除"; this.setAttribute("class", "watchlater"); } else { divTip.textContent = "已添加至稍后再看"; this.setAttribute("class", "watchlater active"); addWatchlater(fanhao2); delWatched(fanhao2); divAddWatched2.textContent = "添加已观看"; delStar(fanhao2); divStar2.setAttribute("class", "star"); } event.preventDefault(); }); movieBox.addEventListener("mouseenter", function(event) { const watchlater = this.querySelector(".watchlater"); const addWatched2 = this.querySelector(".add_watched"); const watched = this.querySelector(".watched"); const star = this.querySelector(".star"); const fanhao2 = getFanhao(this); if (!isWatched(fanhao2)) { addWatched2.textContent = "添加已观看"; } else { addWatched2.textContent = "取消已观看"; } if (isWatchlater(fanhao2)) { watchlater.setAttribute("class", "watchlater active"); } else { watchlater.setAttribute("class", "watchlater"); } if (isStar(fanhao2)) { star.setAttribute("style", "display:block;"); star.setAttribute("class", "star active"); } else { star.setAttribute("style", "display:none;"); } watchlater.setAttribute("style", "display:block;"); addWatched2.setAttribute("style", "display:block;"); watched.setAttribute("style", "display:none;"); star.setAttribute("style", "display:block;"); }); movieBox.addEventListener("mouseleave", function(event) { const watchlater = this.querySelector(".watchlater"); const addWatched2 = this.querySelector(".add_watched"); const watched = this.querySelector(".watched"); const star = this.querySelector(".star"); addWatched2.setAttribute("style", "display:none;"); const fanhao2 = getFanhao(this); if (isWatchlater(fanhao2)) { watchlater.setAttribute("class", "watchlater active"); watchlater.setAttribute("style", "display:block;"); } else { watchlater.setAttribute("style", "display:none;"); } if (isWatched(fanhao2)) { watched.setAttribute("style", "display:block;"); } else { watched.setAttribute("style", "display:none;"); } if (isStar(fanhao2)) { star.setAttribute("style", "display:block;"); } else { star.setAttribute("style", "display:none;"); } }); const fanhao = getFanhao(movieBox); if (isWatched(fanhao)) { const watched = movieBox.querySelector(".watched"); watched.setAttribute("style", "display:block;"); } if (isWatchlater(fanhao)) { const watchlater = movieBox.querySelector(".watchlater"); watchlater.setAttribute("class", "watchlater active"); watchlater.setAttribute("style", "display:block;"); } if (isStar(fanhao)) { const star = movieBox.querySelector(".star"); star.setAttribute("class", "star active"); star.setAttribute("style", "display:block;"); } }); } function runInActressPage() { const photoFrame = document.querySelector(".avatar-box > .photo-frame"); const divLikeActress = photoFrame.querySelector(".like-actress"); divLikeActress.addEventListener("click", function() { const actressId2 = location.href.split("/").at(-1); if (isLikeActress(actressId2)) { delLikeActress(actressId2); this.setAttribute("class", "like-actress"); } else { addLikeActress(actressId2); this.setAttribute("class", "like-actress active"); } }); const actressId = location.href.split("/").at(-1); if (isLikeActress(actressId)) { document.querySelector(".like-actress").setAttribute("class", "like-actress active"); } else { document.querySelector(".like-actress").setAttribute("class", "like-actress"); } } initLevelDB(); document.addEventListener("DOMContentLoaded", () => { document.querySelectorAll(".ad-box").forEach((ad) => { ad.parentNode.removeChild(ad); }); const pinia = createPinia(); const app = vue.createApp(App); app.use(pinia); app.mount( (() => { const app2 = document.createElement("div"); app2.id = "mount-point"; document.body.append(app2); return app2; })() ); if (/\/#?$/.test(location.href) || /page|genre|search|star|studio|series|label|director|uncensored/.test(location.href)) { runInListPage(); } if (/\/\w+\-\d+#?$/.test(location.href)) { runInSinglePage(); } if (/[^search]star/.test(location.href)) { runInActressPage(); } }); })(Vue);